1 變量和常量
- 常量&變量的使用原則:
為保證數(shù)據(jù)的安全性盡量先用 let,只有需要改變的時候才使用 var
let 常量: 常量的值一旦設定就不能改變
var 變量: 變量的值可以隨意更改
- 定義常量的格式:
聲明符號 常量名稱: 類型標注
let number: Int // 特點: 一旦設定就不能改變
let number: Int = 10
number = 20 //不可修改常量的值
- 定義變量格式:
*聲明符號 變量名稱: 類型標注
var number: Int
*特點: 變量的值可以隨意更改
*注意: 一般來說你很少需要寫類型標注遂填。如果你在聲明常量或者變量的時候賦了一個初始值吓坚,Swift可以推斷出這個常量或者變量的類型
var number: Int = 10
number = 20 //可修改變量的值
- 類型推斷
編譯器可以在編譯代碼的時候自動推斷出表達式的類型。(其它語言是沒有類型推斷)椎镣,原理很簡單,只要檢查你賦的值即可碎绎。如果沒有指定表達式的類型, 也沒有賦予初始值, 編譯器會報錯(type annotation missing in pattern)脱羡。
let number1 = 10
var number2 = 20.1
// 注意點: 如果沒有指定表達式的類型, 也沒有賦予初始值, 編譯器會報錯
- 類型安全
Swift 是一個類型安全(type safe)的語言, 它會在編譯你的代碼時進行類型檢查(type checks)秧均,并把不匹配的類型標記為錯誤。
let number: Int = 10.1 //類型不匹配
這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復錯誤锯七。swift 對數(shù)據(jù)類型要求異常嚴格, swift 中任何時候誉己,都不會做 隱式轉換巨双,如果要對不同類型的數(shù)據(jù)進行計算,必須顯示類型轉換袱蜡。
let number1 = 10
let number2 = 10.1
// let sum = number7 + number8 //類型不匹配慢宗,無法進行計算
// 必須進行類型轉換
let sum = let sum = Double(number1) + number2
let sum1 = number1 + Int(number2)
注意:
- 結合數(shù)字類常量和變量不同于結合數(shù)字類字面量婆廊。字面量8可以直接和字面量3.1415926相加,因為數(shù)字字面量本身沒有明確的類型茵典。它們的類型只在編譯器需要求值的時候被推測统阿。
// 字面量之間運算可以是不同類型
let sum2 = 10 + 10.1
- Double和CGFloat也需要轉換
let point = CGPoint(x: 10.10, y: 20.20)
let temp = point.x
let sum = double(point.x) + temp
- 常量和變量的命名
- 你可以用任何你喜歡的字符作為常量和變量名,包括 Unicode 字符
let ?? = "狗"
let 你好 = “你好世界”
- 常量與變量名不能包含數(shù)學符號帆离,箭頭结澄,保留的(或者非法的)Unicode 碼位麻献,連線與制表符
- 也不能以數(shù)字開頭,但是可以在常量與變量名的其他地方包含數(shù)字
- 如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變量名监婶,你可以使用反引號(`)將關鍵字包圍的方式將其作為名字使用齿桃。
let `Int` = 10
// 無論如何短纵,你應當避免使用關鍵字作為常量或變量名,除非你別無選擇刮刑。
2 元組(tuples)
元組(tuples)把多個值組合成一個復合值养渴,將多個相同或者不同類型的值用一個小括號括起來就是一個元祖理卑,元組內(nèi)的值可以是任意類型蔽氨,并不要求是相同類型,作為函數(shù)返回值時鹉究,元組非常有用宇立。
let http404Error = (404, "Not Found")
元組的訪問:
- 你可以分解表的內(nèi)容到單獨的常量或變量,你再像往常一樣訪問:
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// Prints "The status code is 404"
print("The status message is \(statusMessage)")
// Prints "The status message is Not Found"
- 使用從零開始索引號訪問元組的各個元素值:
print("The status code is \(http404Error.0)")
// Prints "The status code is 404"
print("The status message is \(http404Error.1)")
// Prints "The status message is Not Found"
- 你還可以制定元素名稱去命名并且訪問一個元組:
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// Prints "The status code is 200"
print("The status message is \(http200Status.description)")
// Prints "The status message is OK"
3 可選類型(Optionals)
可選類型表示變量可以有值, 也可以沒有值自赔。C 和 Objective-C 中并沒有可選類型這個概念妈嘹。
- 格式:
Optional<類型>
或 在類型后面加上?
號。由于可選類型在Swift中隨處可見, 所以系統(tǒng)做了一個語法糖, 在類型后面加上?
var number: Optional<Int>
number = 10
var serverResponseCode: Int? = 404
- 可選類型的取值是一個枚舉(
None
沒有值Some
有值)绍妨。Swift中只有可選類型才可以賦值為nil
润脸。
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
- 如果你聲明一個可選常量或者變量但是沒有賦值柬脸,它們會自動被設置為
nil
。
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
注意:
nil
不能用于非可選的常量和變量倒堕。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型爆价。
Swift 的nil
和 Objective-C 中的nil
并不一樣垦巴。在 Objective-C 中,nil
是一個指向不存在對象的指針, 所以Objective-C只有對象類型才能被設置為nil
(基本類型不行)铭段。在 Swift 中魂那,nil
不是指針——它是一個確定的值,用來表示值缺失稠项。任何類型的可選狀態(tài)都可以被設置為nil
涯雅,不只是對象類型。
解包:
- 強制解析(forced unwrapping)
Swift中可選類型的值不能當做普通類型的值來使用,如果想使用可選類型的值必須進行解包操作展运。只需要在變量/常量后面加上!
就可以解包活逆,解包代表著告訴系統(tǒng), 該變量/常量中一定有值。
var serverResponseCode: Int?
serverResponseCode = 404
print (serverResponseCode!)
注意:
1.init?
構造函數(shù),?
表示不一定能夠?qū)嵗鰧ο?
2.!
表示告訴編譯器一定有值, 編譯能夠通過, 如果運行時沒有值就會直接崩潰
3.在Swift開發(fā)中, 盡量不要使用強制解包, 不安全
- 可選綁定(optional binding)
不需要考慮url是否有值, 能進入{}一定有值拗胜;不僅可以用來判斷可選類型中是否有值蔗候,同時可以將可選類型中的值賦給一個常量或者變量, 可選綁定可以用在if
和while
語句中。
let url = NSURL(string: "http://www.baidu.com")
if let temp = url {
// code...
// temp的作用域只在這個"{}"里面
}
if let firstNumber = Int("4"), secondNumber = Int("42") where firstNumber < secondNumber {
print("\(firstNumber) < \(secondNumber)")
}
注意:
if
語句中的變量/常量(temp)的作用域為{}
中埂软。
- guard
guard語句是在Swift 2.0中引進的锈遥,它是用途是在未滿足某個條件時,提供一個退出的路徑勘畔。
func test(){
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
guard let temp1 = value1 else{
return
}
guard let temp2 = value2 else{
return
}
guard let temp3 = value3 else{
return
}
guard let temp4 = value4 else{
return
}
let sum = temp1 + temp2 + temp3 + temp4
print(sum)
}
test()
// prints 100
注意:
guard中的變量/常量 可以在guard后面使用(作用域);
guard一般用于避免使用強制拆包, 優(yōu)化代碼結構
- 隱式解析可選類型(implicitly unwrapped optionals)
有時候在程序架構中所灸,第一次被賦值之后,可以確定一個可選類型總會有值炫七。在這種情況下爬立,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值万哪。 隱式解析可選類型, 并不需要每次都使用解析來獲取可選值, 一個隱式解析可選類型其實就是一個普通類型侠驯,但是可以被當做非可選類型來使用。
let FshButton: UIButton!
注意:
如果一個變量之后可能變成nil
的話請不要使用隱式解析可選類型奕巍。如果你需要在變量的生命周期中判斷是否是nil
的話吟策,請使用普通可選類型。
var doubleValue: Double!
doubleValue = 3.14
doubleValue = nil
print(doubleValue)
報錯原因是編譯器檢測到隱式解析可選類型在賦值為nil
的止。
總結一下:
//可選類型(強制解包檩坚,不推薦)
let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)
if intValue != nil {
print(intValue!)
}
// 可選綁定
if let temp = intValue {
print(temp)
}
//隱式解析可選類型
var doubleValue: Double!
doubleValue = nil
doubleValue = 3.14
print(doubleValue)