Swift 1 -基礎(chǔ)

一极祸、數(shù)據(jù)類型

Swift 包含了 C 和 Objective-C 上所有基礎(chǔ)數(shù)據(jù)類型,Int 表示整型值怠晴、DoubleFloat 表示浮點(diǎn)型值遥金、Bool 是布爾型值、String 是文本型數(shù)據(jù)蒜田。Swift 還提供了三個(gè)基本的集合類型:Array稿械、SetDictionary

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ò)展。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砂心,一起剝皮案震驚了整個(gè)濱河市懈词,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辩诞,老刑警劉巖坎弯,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異译暂,居然都是意外死亡抠忘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)外永,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崎脉,“玉大人,你說(shuō)我怎么就攤上這事伯顶∏糇疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砾淌,是天一觀的道長(zhǎng)啦撮。 經(jīng)常有香客問(wèn)我谭网,道長(zhǎng)汪厨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任愉择,我火速辦了婚禮劫乱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锥涕。我一直安慰自己衷戈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布层坠。 她就那樣靜靜地躺著殖妇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪破花。 梳的紋絲不亂的頭發(fā)上谦趣,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音座每,去河邊找鬼前鹅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛峭梳,可吹牛的內(nèi)容都是我干的舰绘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捂寿!你這毒婦竟也來(lái)了口四?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秦陋,失蹤者是張志新(化名)和其女友劉穎窃祝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踱侣,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粪小,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抡句。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片探膊。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖待榔,靈堂內(nèi)的尸體忽然破棺而出逞壁,到底是詐尸還是另有隱情,我是刑警寧澤锐锣,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布腌闯,位于F島的核電站,受9級(jí)特大地震影響雕憔,放射性物質(zhì)發(fā)生泄漏姿骏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一斤彼、第九天 我趴在偏房一處隱蔽的房頂上張望分瘦。 院中可真熱鬧,春花似錦琉苇、人聲如沸嘲玫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)去团。三九已至,卻和暖如春穷蛹,著一層夾襖步出監(jiān)牢的瞬間土陪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工俩莽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺坠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓扮超,卻偏偏與公主長(zhǎng)得像取刃,于是被迫代替她去往敵國(guó)和親蹋肮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 級(jí)別: ★☆☆☆☆標(biāo)簽:「iOS」「Swift 5.1」「常量變量」「元組」「可選項(xiàng)」「可選綁定」作者: 沐靈洛審...
    QiShare閱讀 866評(píng)論 0 6
  • Swift 5.1 (1) - 基礎(chǔ) 常量和變量:常量的值一旦設(shè)置就不能更改璧疗,而變量可以在將來(lái)設(shè)置為不同的值坯辩。常量...
    沐靈洛閱讀 2,164評(píng)論 0 14
  • swift是Apple在2014年6月WWDC發(fā)布的全新編程語(yǔ)言,中文名和LOGO是雨燕崩侠,Swift是由Chris...
    coder_feng閱讀 664評(píng)論 0 4
  • 來(lái)至 Swift - 雨燕 一. 概要 支持傳統(tǒng)的面向?qū)ο缶幊?提升至"面向協(xié)議編程",即由"類"->"值". 提...
    Mccc_閱讀 550評(píng)論 2 3
  • 元組 定義: 可以將多個(gè)不同類型的值合成單個(gè)復(fù)合值漆魔。(可以是任意類型的) 使用:可以將內(nèi)容分為常量或變量進(jìn)行常規(guī)訪...
    永斷閻羅閱讀 337評(píng)論 0 1