在swift中的optional類型就像在OC中使用nil一樣若厚,但是它可以用于任何類型拦英,而不僅僅是類。
swift是一種類型安全的語言测秸,它甚至能夠阻止你把一個optional string類型的變量傳給一個需要string類型的代碼塊疤估。
Constants and Variables
Declaring Constants and Variables
你可以在一行聲明多個常量或變量,使用逗號分隔霎冯。
var x = 0.0, y = 0.0, z = 0.0
Type Annotations
在變量或常量后加一個冒號铃拇,然后跟著一個空格,空格之后是需要使用的類型沈撞。
var welcomeMessage: String
可以在一行聲明多個同類型的變量(??本文中的“變量” 指的是變量和常量兩種慷荔,下同。注意根據(jù)語境區(qū)分缠俺。)显晶,只在最后做類型聲明。
var red, green, blue: Double
如果聲明變量時沒有賦初值壹士,必須做類型聲明磷雇。
Naming Constants and Variables
變量的名字幾乎可以包含任意字符。不能以數(shù)字開頭躏救。一旦使用一個名字聲明了變量唯笙,就不能再使用了。也不能做常量變量之間的轉(zhuǎn)換盒使。
Printing Constants and Variables
print()
沒有什么好說的崩掘。
Comments
單行注釋 //
多行注釋 /* */
與c語言不同的是,多行注釋可以嵌套在多行注釋中少办。
Semicolons
swift不需要在每行語句結(jié)束后加分好苞慢,你要是愿意寫頁沒人管你。
但是凡泣,如果一行有多條語句枉疼,那就要加分號分隔了。
Integers
跟C語言類似鞋拟,有8位骂维、16位、32位贺纲、64位的有符號和無符號整型航闺。例如 UInt8 、Int32。
Integer Bounds
使用 min 和 max 屬性獲得某個類型整型的最值潦刃。
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
Int
絕大多數(shù)情況下侮措,你不需要去指定整型的大小。swift提供了一個Int類型乖杠,這個類型跟平臺有關(guān)分扎。
當然還有一個 UInt 類型。
Floating-Point Numbers
Double : 64 位胧洒, 至少15位小數(shù)
Float : 32位畏吓, 6位小數(shù)。
Type Safety and Type Inference
swift是一種類型安全的語言卫漫,它不意味著你聲明變量的時候必須指定它的類型菲饼,因為編譯器會推斷出變量的類型。即使編譯器可以為我們做一些類型判斷的工作列赎,但是變量是可變類型還是不可變的還是需要開發(fā)者指定的宏悦。
Numeric Literals
為了增強可讀性,整型和浮點型的變量可以在前面加0包吝、在數(shù)字間加下劃線饼煞。
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
Numeric Type Conversion
通常使用整型就使用Int,即使這些數(shù)都是正數(shù)漏策。這樣的好處之一是派哲,它能與編譯器推斷的類型匹配臼氨。而且指定整型的位數(shù)掺喻,會帶來額外的開銷。
Integer Conversion
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
UInt16不能與UInt8相加储矩。
Integer and Floating-Point Conversion
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
let integerPi = Int(pi)
浮點型轉(zhuǎn)整型感耙,采用去尾法。
Type Aliases
為已經(jīng)存在的類型聲明一個別名持隧,使用typealias關(guān)鍵字即硼。
typealias AudioSample = UInt16
Booleans
swift的布爾類型是Bool,它有兩種常量值:true 和 false。
Tuples
元組內(nèi)的變量類型可以不相同屡拨。
let http404Error = (404, "Not Found")
可以把元組的內(nèi)容分解成多個變量或常量只酥。
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// Prints "The status code is 404"
如果你只需要元組的部分內(nèi)容,把不關(guān)心的部分使用_代替呀狼。
let (justTheStatusCode, _) = http404Error
也可以使用index取得元組的某個內(nèi)容裂允。index start from 0。
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)")
元組作函數(shù)的返回值特別好用。為了臨時返回不同類型的值十饥,不用組織一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu)窟勃。
Optionals
當可能沒有值的時候需要使用optional。
let possibleNumber = "123a"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or "optional Int"
nil
不能給一個非optioanl類型的變量賦值nil逗堵。
沒有給optional類型的變量賦初值的時候秉氧,會被自動設(shè)置成nil。
If Statements and Forced Unwrapping
如果你已經(jīng)知道了optional類型的變量有值蜒秤,可以在變量后加上!來取它的值谬运。
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
Optional Binding
在 if 和 while 中可以檢查optional變量是否有值,如果有值臨時賦值給一個常量或變量垦藏。
if let actualNumber = Int(possibleNumber) {
print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
print("\"\(possibleNumber)\" could not be converted to an integer")
}
可以在 if 中判斷多個條件梆暖,使用逗號分隔。只要一個為nil 或 false掂骏,整體就為false轰驳。
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
Implicitly Unwrapped Optionals
如果能確定一個optional 的變量在某次賦值之后就不會變nil了,可以用隱式解析可選類型代替(String5茏啤)级解。
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark
隱式解析可選類型也是可選類型,也可以做 if let田绑。它跟可選類型的區(qū)別是勤哗,每次使用不需要判斷了。提高了效率掩驱。
如果一個 String芒划!類型變量的值是nil,你去取它的值欧穴,會得到一個運行時的錯誤民逼。
Assertions and Preconditions
斷言和前提條件會在運行時檢查,確保某些代碼在滿足條件執(zhí)行涮帘。如果判斷結(jié)果為true拼苍,代碼能繼續(xù)執(zhí)行;如果為false调缨,程序被中斷疮鲫。
斷言只在debug模式下有效。
前提條件在debug和build模式下都只執(zhí)行弦叶。
Debugging with Assertions
當斷言的條件為false時俊犯,可以輸出一條語句。
let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
也可以省略輸出語句
assert(age >= 0)
可以使用assertionFailure函數(shù)表明湾蔓,斷言已經(jīng)失敗了瘫析。
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age > 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
Enforcing Preconditions
例如,使用前提條件檢查下表是否越界、函數(shù)的參數(shù)是否有效贬循。
precondition(index > 0, "Index must be greater than zero.")