一极祸、數(shù)據(jù)類型
Swift 包含了 C 和 Objective-C 上所有基礎(chǔ)數(shù)據(jù)類型,Int
表示整型值怠晴、Double
和 Float
表示浮點(diǎn)型值遥金、Bool
是布爾型值、String
是文本型數(shù)據(jù)蒜田。Swift 還提供了三個(gè)基本的集合類型:Array
稿械、Set
和 Dictionary
。
Swift 還提供了 OC 中沒(méi)有的高階數(shù)據(jù)類型比如元組 Tuple
冲粤。元組可以讓你創(chuàng)建或者傳遞一組數(shù)據(jù)美莫,元組的數(shù)據(jù)類型不必一致。
Swift 還增加了可選(Optional
)類型梯捕,用于處理值缺失的情況厢呵。可選表示一個(gè)變量可以有一個(gè)值或者沒(méi)有值傀顾。
Swift 是一種類型安全的語(yǔ)言襟铭,Swift 可以讓你清楚地知道值的類型。如果你的代碼期望得到一個(gè) String
,類型安全會(huì)阻止你不小心傳入一個(gè) Int
寒砖。同樣的赐劣,如果你的代碼期望得到一個(gè) String
,類型安全會(huì)阻止意外傳入一個(gè)可選的 String
哩都。類型安全幫助在開(kāi)發(fā)階段盡早發(fā)現(xiàn)錯(cuò)誤魁兼。
二、常量和變量
常量和變量把一個(gè)名字和一個(gè)指定類型的值關(guān)聯(lián)起來(lái)漠嵌。常量的值一旦設(shè)定就不能改變咐汞,而變量的值可以隨意更改。
1.聲明常量和變量
常量和變量必須在使用前聲明献雅,用 let
聲明常量碉考,用 var
聲明變量塌计。
2.類型標(biāo)注
當(dāng)聲明常量或者變量的時(shí)候可以加上類型標(biāo)注(type annotation)挺身,說(shuō)明常量或者變量中要存出的值得類型。
var a:Int=1
可以在一行中定義多個(gè)同樣類型的變量锌仅,用逗號(hào)分隔章钾,并在最后一個(gè)變量名之后添加類型標(biāo)注。
var a,b,c:String
三热芹、元組
元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值贱傀。元組內(nèi)的值可以是任意類型,并不要求是相同類型伊脓。
(100,"cjj")
是一個(gè) (Int,String)
類型的元組府寒。
可以把任意順序的類型組合成一個(gè)元組,這個(gè)元組可以包含所有類型报腔。
可以將一個(gè)元組的內(nèi)容分解(decompose)成單獨(dú)的常量和變量株搔,然后可以正常使用了。
var a=(100,"cjj")
var (c,d)=a
四纯蛾、可選類型
OC 中沒(méi)有 Optional
類型纤房,OC 中所有對(duì)象變量都可以為 nil
,因?yàn)?nil
是無(wú)類型的指針翻诉。在 OC 中字典炮姨、數(shù)組、集合都不能放入 nil
碰煌,nil
只能用在 OC 對(duì)象上面舒岸,變量在一定程度上來(lái)講便利性較差,但在 Swift 中卻不同芦圾。Swift 中 nil
和 OC 中的 nil
是有很大區(qū)別的吁津。在 OC 中 nil
是指向一個(gè)不存在的對(duì)象的指針,但是在 Swift 中,nil
不是指針碍脏,只是值缺失的特殊類型梭依,任何類型可選項(xiàng)都可以設(shè)置為 nil
。所以在 Swift 中典尾,可以用可選項(xiàng)值為 nil
役拴,來(lái)表達(dá)變量的值缺失,增加了一定的便利性钾埂。
Swift 中我們?cè)谧兞款愋秃竺嫣砑??
來(lái)表示一個(gè)可選項(xiàng)河闰,例如:
var name: String? = nil
1.實(shí)現(xiàn)
Optional
其實(shí)是一個(gè)枚舉類型,我們查看標(biāo)準(zhǔn)庫(kù)中代碼可以看到
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
/// The absence of a value.
///
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none
/// The presence of a value, stored as `Wrapped`.
case some(Wrapped)
/// Creates an instance that stores the given value.
public init(_ some: Wrapped)
這個(gè)枚舉有兩個(gè)值褥紫,代碼 Optional
的兩層意思
-
none
代表變量沒(méi)有值姜性,即為nil
-
some
代表變量有值,值為some
髓考,some
包裝了實(shí)際了值
那 Optional
是如果得到實(shí)際的值呢部念,還是來(lái)看標(biāo)準(zhǔn)庫(kù)中的代碼
/// The wrapped value of this instance, unwrapped without checking whether
/// the instance is `nil`.
///
/// The `unsafelyUnwrapped` property provides the same value as the forced
/// unwrap operator (postfix `!`). However, in optimized builds (`-O`), no
/// check is performed to ensure that the current instance actually has a
/// value. Accessing this property in the case of a `nil` value is a serious
/// programming error and could lead to undefined behavior or a runtime
/// error.
///
/// In debug builds (`-Onone`), the `unsafelyUnwrapped` property has the same
/// behavior as using the postfix `!` operator and triggers a runtime error
/// if the instance is `nil`.
///
/// The `unsafelyUnwrapped` property is recommended over calling the
/// `unsafeBitCast(_:)` function because the property is more restrictive
/// and because accessing the property still performs checking in debug
/// builds.
///
/// - Warning: This property trades safety for performance. Use
/// `unsafelyUnwrapped` only when you are confident that this instance
/// will never be equal to `nil` and only after you've tried using the
/// postfix `!` operator.
@inlinable public var unsafelyUnwrapped: Wrapped { get }
它是一個(gè)定義的 get
方法,Optionl
通過(guò) unsafelyUnwrapped
來(lái)獲取實(shí)際的值氨菇,例如
var ddb: String? = "哈哈哈"
let ddbCount = ddb.unsafelyUnwrapped.count
這樣就得到了變量的實(shí)際值儡炼。
2.使用
1.實(shí)現(xiàn)一個(gè) Optional
let ddb: Optional<String> = "哈哈哈"
// var ddb: String? = "哈哈哈"
我們這樣實(shí)現(xiàn)的可選項(xiàng),實(shí)際上和注釋部分的類型后面加 ?
實(shí)現(xiàn)的是完全一樣的查蓉。
3.可選項(xiàng)的解包
可選項(xiàng)是不能直接使用的乌询,需要解包后才能使用,基本上有一下解包方式
(1)!
強(qiáng)制解包
let count = ddb!.count
在強(qiáng)制解包前豌研,你如果不知道它是否為 nil
妹田,那你需要先對(duì)它進(jìn)行非 nil
的判斷保護(hù),否則強(qiáng)制解包一旦失敗鹃共,程序會(huì)報(bào)錯(cuò)鬼佣,如下代碼:
if ddb != nil {
let count = ddb!.count
print(count)
}
這樣即使我們使用了強(qiáng)制解包,但它的運(yùn)行依然是安全的
(2)if
判斷展開(kāi)
if ddb != nil {
let count = ddb?.count
print(count ?? 0)
}
這里我們使用 a ?? b
合并空值運(yùn)算符的方式來(lái)解包及汉,如果有值沮趣,則為 count
,如果為 nil
坷随,則默認(rèn) 0
使用合并控制運(yùn)算符有兩個(gè)條件:
1.表達(dá)式 a
必須是可選類型
2.表達(dá)式 b
必須和 a
的類型相同
(3)使用可選項(xiàng)綁定的方式
if let ddbStr = ddb {
let count = ddbStr.count
print(count)
}
使用可選項(xiàng)綁定來(lái)判斷可選項(xiàng)是否有值房铭,如果有就賦值給臨時(shí)變量。同一個(gè) if
語(yǔ)句可以有多個(gè)可選項(xiàng)綁定温眉,用,
分開(kāi)即可
小結(jié)
Optional
是”不存在“或“空”概念的加強(qiáng)版本缸匪。而 nil
則是“不存在”的基礎(chǔ)版本
在 Swift 中引入 Optional
的目的,就是將"不存在"這個(gè)概念綁定到具體的類型上类溢。optional.nil
指向的是值的“不存在”凌蔬,同時(shí)表示:如有值只能是 optional.some<T>
中的 T
類型露懒,將所有類型的值空間進(jìn)行了 nil
的擴(kuò)展。