Swfit-01.可變參數(shù),多重可選項(xiàng)院仿,MemoryLayout。速和。歹垫。

tree_26.jpg
  • 1. Playground支持Markup(類似Markdown)語言書寫注釋。
    //: [上一頁](@previous): 上一頁
    //: [下一頁](@next): 下一頁
    #:幾個對應(yīng)幾級標(biāo)題
    -:無序標(biāo)題
    1.:有序標(biāo)題
    >:筆記
    ---:分割線
    [圖片上傳失敗...(image-16af49-1606451751395)]:圖片
    [blog](http://blogzhou.top):連接
    ** bold **:粗體
    * italic *:斜體
  • 2. Let :不要求在編譯時確定颠放,但使用前必須賦值排惨。也就是實(shí)例初始化前必須有值,(存儲類型屬性除外)
// 下面代碼錯誤慈迈,因聲明時未指明常量類型
let age
age = 18
  • 3. 可變參數(shù)
    public func print(_ items: Any..., separator: String = " ", terminator: String = "\n"):形如 Any... 為可變參數(shù)
  • 4. 函數(shù)可作為參數(shù)和返回值若贮。
// 作為參數(shù)

func sum(v1: Int, v2: Int) -> Int { 
    v1 + v2
}
func difference(v1: Int, v2: Int) -> Int {
    v1 - v2
}
func printResult(_ mathFn: (Int, Int) -> Int, _ a: Int, _ b: Int) { 
    print("Result: \(mathFn(a, b))")
}
printResult(sum, 5, 2) // Result: 7
printResult(difference, 5, 2) // Result: 3

----------------------------------------------------------------------------------------------------------

// 作為返回值

func next(_ input: Int) -> Int { 
    input + 1
}
func previous(_ input: Int) -> Int {
    input - 1 
}
func forward(_ forward: Bool) -> (Int) -> Int { 
    forward ? next : previous
}
forward(true)(3) // 4
forward(false)(3) // 2
n返回值是函數(shù)類型的函數(shù),叫做高階函數(shù)(Higher-Order Function)
  • 5. 方法
// 嵌套函數(shù)痒留。
 func forward(_ forward: Bool) -> (Int) -> Int { 
    func next(_ input: Int) -> Int {
        input + 1 
    }
    func previous(_ input: Int) -> Int {
       input - 1
    }
    return forward ? next : previous
}
forward(true)(3) // 4
forward(false)(3) // 2
  • 將方法賦值給var\let
    方法也可以像函數(shù)那樣,賦值給一個let或者var
struct Person {
    var age: Int
    func run(_ v: Int) { print("func run", age, v) }
    static func run(_ v: Int) { 
        print("static func run", v) 
    } 
}

let fn1 = Person.run
fn1(10) // static func run 10
let fn2: (Int) -> () = Person.run fn2(20) // static func run 20
let fn3: (Person) -> ((Int) -> ()) = Person.run 
fn3(Person(age: 18))(30) // func run 18 30
  • 6. 枚舉蠢沿。
  • 關(guān)聯(lián)值(Associated Values)
    • 有時將枚舉的成員值跟其他類型的值關(guān)聯(lián)存儲在一起伸头,會非常有用
enum Score {
    case points(Int)
    case grade(Character)
}

var score = Score.points(96) 
score = .grade("A")

switch score {
    case let .points(i):
        print(i, "points") 
    case let .grade(i):
        print("grade", i)
} // grade A
  • 遞歸枚舉:
// indirect修飾
indirect enum ArithExpr {
    case number(Int)
    case sum(ArithExpr, ArithExpr)
    case difference(ArithExpr, ArithExpr)
}

enum ArithExpr {
    case number(Int)
    indirect case sum(ArithExpr, ArithExpr) 
    indirect case difference(ArithExpr, ArithExpr)
}
let five = ArithExpr.number(5)
let four = ArithExpr.number(4)
let two = ArithExpr.number(2)
let sum = ArithExpr.sum(five, four)
let difference = ArithExpr.difference(sum, two)

func calculate(_ expr: ArithExpr) -> Int { 
    switch expr {
      case let .number(value): 
          return value
      case let .sum(left, right):
          return calculate(left) + calculate(right)
      case let .difference(left, right):
           return calculate(left) - calculate(right)
    } 
}
calculate(difference)
  • 7. 可以使用MemoryLayout獲取數(shù)據(jù)類型占用的內(nèi)存大小
enum Password {
    case number(Int, Int, Int, Int)
    case other
} 

MemoryLayout<Password>.stride // 40, 分配占用的空間大小 
MemoryLayout<Password>.size // 33, 實(shí)際用到的空間大小 
MemoryLayout<Password>.alignment // 8, 對齊參數(shù)

var pwd = Password.number(9, 8, 6, 4)
pwd = .other 
MemoryLayout.stride(ofValue: pwd) // 40 
MemoryLayout.size(ofValue: pwd) // 33
MemoryLayout.alignment(ofValue: pwd) // 8

  • 8. 可選項(xiàng)(Optional)
// n 可選項(xiàng),一般也叫可選類型舷蟀,它允許將值設(shè)置為nil 
// n在類型名稱后面加個問號? 來定義一個可選項(xiàng)
var name: String? = "Jack"
name = nil
var age: Int? // 默認(rèn)就是nil 
age = 10
age = nil
var array = [1, 15, 40, 29] 
func get(_ index: Int) -> Int? {
    if index < 0 || index >= array.count { 
        return nil
    }
    return array[index]
} 
print(get(1)) // Optional(15)
print(get(-1)) // nil 
print(get(4)) // nil

  • 可選項(xiàng)是對其他類型的一層包裝恤磷,可以將它理解為一個盒子

    • 如果為nil,那么它是個空盒子
    • 如果不為nil野宜,那么盒子里裝的是:被包裝類型的數(shù)據(jù)
      • 可選類型
  • 如果要從可選項(xiàng)中取出被包裝的數(shù)據(jù)(將盒子里裝的東西取出來)扫步,需要使用感嘆號! 進(jìn)行強(qiáng)制解包

    • 如果對值為nil的可選項(xiàng)(空盒子)進(jìn)行強(qiáng)制解包,將會產(chǎn)生運(yùn)行時錯誤
      var age: Int?
      age!
      Fatal error: Unexpectedly found nil while unwrapping an Optional value

多重可選項(xiàng)

var num1: Int? = 10
var num2: Int?? = num1
var num3: Int?? = 10
 
print(num2 == num3) // true
多重可選項(xiàng)
var num1: Int? = nil
var num2: Int?? = num1
var num3: Int?? = nil
// num2中裝的是個可選類型匈子,num3中裝的是nil河胎,所以不相等。
print(num2 == num3) // false
(num2 ?? 1) ?? 2 // 2
(num3 ?? 1) ?? 2 // 1
上面代碼圖解
  • 9. 空合并運(yùn)算符 ??(Nil-Coalescing Operator)
public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?

public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T 

a ?? b
a 是可選項(xiàng)
b 是可選項(xiàng) 或者 不是可選項(xiàng)
b 跟 a 的存儲類型必須相同
如果 a 不為nil虎敦,就返回 a
如果 a 為nil游岳,就返回 b
如果 b 不是可選項(xiàng)政敢,返回 a 時會自動解包

  • 10. 類 和 結(jié)構(gòu)體
    • 類:引用類型,內(nèi)存在堆上胚迫,默認(rèn)只有一個無參的初始化器(定義成員時指定了初始化值喷户,否則一個沒有)。
    • 結(jié)構(gòu)體:值類型访锻,內(nèi)存根據(jù)代碼定義的地方不同而不同褪尝,默認(rèn)有好多個初始化器。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末期犬,一起剝皮案震驚了整個濱河市河哑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哭懈,老刑警劉巖灾馒,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遣总,居然都是意外死亡睬罗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門旭斥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來容达,“玉大人,你說我怎么就攤上這事垂券』ㄑ危” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵菇爪,是天一觀的道長算芯。 經(jīng)常有香客問我,道長凳宙,這世上最難降的妖魔是什么熙揍? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮氏涩,結(jié)果婚禮上届囚,老公的妹妹穿的比我還像新娘。我一直安慰自己是尖,他們只是感情好意系,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饺汹,像睡著了一般蛔添。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天作郭,我揣著相機(jī)與錄音陨囊,去河邊找鬼。 笑死夹攒,一個胖子當(dāng)著我的面吹牛蜘醋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咏尝,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼压语,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了编检?” 一聲冷哼從身側(cè)響起胎食,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎允懂,沒想到半個月后厕怜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾总,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年粥航,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片生百。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡递雀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚀浆,到底是詐尸還是另有隱情缀程,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布市俊,位于F島的核電站杨凑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摆昧。R本人自食惡果不足惜蠢甲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望据忘。 院中可真熱鬧,春花似錦搞糕、人聲如沸勇吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汉规。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間针史,已是汗流浹背晶伦。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啄枕,地道東北人婚陪。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像频祝,于是被迫代替她去往敵國和親泌参。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • 前言:本篇僅為視頻學(xué)習(xí)筆記 可選項(xiàng) (Optional)★ 可選項(xiàng)常空,一般也叫可選類型沽一,它允許將值設(shè)置為nil。例...
    麥穗0615閱讀 650評論 0 1
  • 一. 可選項(xiàng)的基本使用 可選項(xiàng)漓糙,一般也叫可選類型铣缠,它允許將值設(shè)置為nil。在類型名稱后面加個問號 ? 來定義一個可...
    Imkata閱讀 761評論 0 1
  • 可選項(xiàng)昆禽,也叫做可選類型蝗蛙。定義為可選類型后,可以設(shè)置為 nil 在類型名后面加個問號?來定義可選類型 可選類型如果不...
    Aliv丶Zz閱讀 922評論 0 2
  • 本文源自本人的學(xué)習(xí)記錄整理與理解,其中參考閱讀了部分優(yōu)秀的博客和書籍辐棒,盡量以通俗簡單的語句轉(zhuǎn)述病曾。引用到的地方如有遺...
    水中的藍(lán)天閱讀 476評論 0 2
  • 可選項(xiàng)(Optional) 可選項(xiàng),一般也叫可選類型,它允許將值設(shè)置為nil 在類型名稱后面加個?來定義一個可選項(xiàng)...
    曹來東閱讀 951評論 0 1