//swift中打印用 print,句末中可以不用分號結尾
// print("hello world");
//let聲明常量 陋率,var聲明變量
let myConstant = 42
var myVariable = 42
myVariable = 50
print(myConstant,myVariable)
//如果初始值沒有提供足夠的信息(或沒有初始值)绎狭,那需要在變量后面聲明類型孩饼,用冒號分割龟糕。
let string:String = "ssss"
print(string)
//值永遠不會被隱式轉換成其他類型华弓,如果需要把一個值轉換成其他類型续誉,請顯示轉換
let label = "the width is"
let width = 100
let widthLabel = label + String(width)
print(widthLabel)
//簡單的把值轉換成字符串的方法:把值寫到括號中弛作,并在括號之前寫一個反斜杠
let apples = 3
let oranges = 5
let appleSummary = "I have\(apples) apple."
let fruitSummary = "I have\(apples + oranges) pieces of fruit"
print(appleSummary,fruitSummary)
//使用方括號[]來創(chuàng)建數組和字典,并使用下標或者鍵(key)來訪問元素析校,最后一個元素后面允許有個逗號。
var shoppingList = ["1","2","3","4"]
shoppingList[1] = "bottle if water"
var occupadtions = ["Malcolm":"Captain","Kaylee":"Mechanic",]
occupadtions["Jayne"] = "Public Relations"
print(shoppingList ,occupadtions);
//創(chuàng)建一個空數組或者字典铜涉,使用初始化語法
let emptyArray = [String]()
let emptyDictionary = [String:Float]()
//如果類型信息可以被推斷出來智玻,可以用[]和[:]來創(chuàng)建空數組和空字典--就像你聲明變量或給函數傳參數的時候一樣
shoppingList = []
occupadtions = [:]
//控制流
//使用if和switch來進行條件操作,使用for-in,for,while和repeat-while來進行循環(huán)芙代,包裹條件和循環(huán)變量括號可以省略吊奢,但是語句體的大括號是必須的
let individuaScores = [75,43,103,87,12]
var teamScore = 0
for score in individuaScores {
if score > 50 {
teamScore += 3
}else{
teamScore += 1
}
}
print(teamScore);//輸出值為11
//使用if語句中,條件必須是一個布爾表達式---這意味著像if score {...} 這樣的代碼將報錯纹烹,而不會隱形的與0作對比页滚。可以用if和let來處理缺失的情況滔韵,這些值可由可選值來代表逻谦,一個可選的值是一個具有的值或者是nil以表示值缺失。在類型后面加一個問號 來標記這個變量的值是可選的
var optionalString:String? = "Hello"
print(optionalString == nil)
//如果變量的可選值是nil陪蜻,條件會判斷為false邦马,大括號中的代碼會被跳過,如果不是nil,會將值解包并賦值給let后面的常量滋将,這樣代碼塊就可以使用這個值了邻悬。
var optionalName:String? = "John Appleseed"
var greeting = "hello"
if let name = optionalName {
greeting = "Hello,\(name)"
}else{
//把optionalName改成nil,greeting會是什么?添加一個optionalName語句,當optionalName是nil時給 greeting 賦一個不同的值。
greeting = "Hello,\(optionalName == nil)"
}
print(greeting)
// print("hello,\(greeting)")
//另一種處理可選值的方法是通過使用??操作符號來提供一個默認值随闽,如果可選值缺失的話父丰,可以使用默認值來代替。
let nickName:String? = nil
let fullName:String = "Jhon Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
print(informalGreeting)
//switch支持任意類型的數據以及各種比較操作--不僅僅是整數以及測試相等
let vegetable = "red pepper"
switch vegetable {
case "cekery":
print("Add some raisins and make ants on a log")
case "cucumber","watercress":
print("That would make a good tea sandwich")
//注意let 將匹配等式的值賦值給常量x
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
//用for-in 來遍歷字典,需要兩個變量來表示每個鍵值對.字典是一個無需的集合,所以他們的鍵和值以任意順序迭代結束
let interstingNumbers = ["Prime":[2,3,5,7,11,13],
"Fibonacci":[1,1,2,3,5,8],
"Square":[1,4,9,16,25],]
var largest = 0
for (kind,numbers) in interstingNumbers {
print(numbers,kind)
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
//使用while 來重復運行一段代碼知道不滿足條件掘宪,循環(huán)條件也可以在結尾蛾扇,保證能至少循環(huán)一次
var n = 2
while n < 100 {
n = n * 2
}
print(n)
var m = 2
repeat {
m=m * 2
} while m < 100
print(m)
//你可以在循環(huán)中使用..<來表示范圍,如果想包含的話需要使用...
var total = 0
for i in 0..<4 {
total += i
}
print(total)
/*-------------函數和閉包----------------*/
//使用func 來聲明一個函數魏滚,使用名字和參數來調用函數镀首,使用->來指定函數返回值得的類型
func greets(persons:String,day:String) -> String {
return "Hello \(persons) , today is \(day)."
}
print(greets(persons: "Bob" , day: "Tuesday"))
//默認情況下,函數使用它們的參數名稱作為它們參數的標簽鼠次,在參數名稱前可以自定義參數標簽更哄,或者使用_表示不使用參數標簽
func greet (_ person:String, on day:String)->String{
return"hello \(person),today is \(day)"
}
print(greet("John", on: "wednesday"))
//使用元祖來讓一個函數返回多個值,該元素的元素可以用名稱或數字來表示
func calculateStatistics(scores:[NSInteger]) -> (min: NSInteger,max:NSInteger,sum:NSInteger) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
}else if score < min{
min = score
}
sum += score
}
return (min,max,sum)
}
let statistics = calculateStatistics(scores: [5,3,100,3,9])
print(statistics.sum)
print(statistics.1)
//函數可以帶有可變個數的參數腥寇,這些參數在函數內表現為數組的形式
func sumOf(numbers:NSInteger...) -> NSInteger{
var sum = 0
for number in numbers {
sum += number
}
return sum
}
print(sumOf(),sumOf(numbers: 42,597,12))
//函數可以嵌套成翩,被嵌套的函數可以訪問外側函數的變量,你可以使用嵌套函數來重構一個太長或者太復雜的函數
func returnFifteen() -> NSInteger {
var y = 10
func add() {
y += 5
}
add()
return y
}
print(returnFifteen())
//函數是第一等類型赦役,這意味著函數可以作為另一個函數的返回值
func makeIncrementer() -> ((NSInteger) -> (NSInteger)){
func addOne(number: NSInteger) ->NSInteger {
return 1 + number
}
return addOne
}
let increment = makeIncrementer()
print(increment(7))
//函數也可以當做參數傳入另一個函數
func hasAnyMatches(list:[NSInteger],condition:(NSInteger) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number:NSInteger) -> Bool {
return number < 10
}
let numbers = [20,19,7,12]
print(hasAnyMatches(list: numbers, condition: lessThanTen))
//函數實際上是一種特殊的閉包:它是一段能之后被調取的代碼麻敌,閉包中的代碼能訪問閉包所建作用域中能得到的變量函數,即使閉包是在一個不同的作用域被執(zhí)行的扩劝,你已經在嵌套函數例子中多看到庸论,你可以用{}來創(chuàng)建一個匿名閉包, 使用in將參數和返回值類型聲明與閉包函數進行分離
let mappedNumbers1 = numbers.map({
(number:NSInteger) -> NSInteger in
let resault = 3 * number
return resault
})
print(mappedNumbers1)
//有很多種創(chuàng)建簡單的閉包方法棒呛,如果一個閉包的類型已知聂示,比如作為一個回調函數,你可以忽略參數的類型和返回值簇秒,單個語句閉包會把他語句的值當做結果返回
let mappedNumbers2 = numbers.map({number in 3*number})
print(mappedNumbers2)
//你可以通過參數位置而不是參數名字來引用參數---這個方法在非常的閉包中非常有用鱼喉。當一個閉包作為最后一個參數傳至給一個函數的時候,它可以直接跟在括號后面趋观,當一個閉包是還給函數的唯一參數扛禽,你可以完全忽略括號
let sortedNumbers = numbers.sorted()
print(sortedNumbers)