swift 代碼示例

  1. try catch 的使用示例
enum Error:ErrorType{
    case error1
    case error2
}
func f1() throws{
    throw(Error.error2)
}
do{
    try f1()
    print("no error")
}catch Error.error1{
    print("has error1")
}catch Error.error2{
    print("has error2")
}
  1. 空合運(yùn)算符(Nil Coalescing Operator
var a:Int?
let b:Int = 10
let c = a ?? b
print("c = \(c)")

ps.以上代碼類似

c = a != nil ?a! :b

但看起來更加優(yōu)雅

  1. 區(qū)間運(yùn)算符
for i in 1...5{
    print("\(i) ")
}
for i in 1..<5{
    print("\(i) ")
}

swift 中并沒有左開右閉區(qū)間

  1. 字符串的utf-8 utf-16 unicode 表示
let s = "hello world"
for u in s.utf8{
    print("\(u) ")
}
for u in s.utf16{
    print("\(u) ")
}
for u in s.unicodeScalars{
    print("\(u) ")
}
  1. 可變參數(shù)
func arithmeticMean(numbers:Double...) -> Double{
    var total:Double = 0
    for number in numbers{
      total += number
    }
    return total/Double(numbers.count)
}
print("average number = \(arithmeticMean(1,2,3))")
  1. 函數(shù)類型
func addTwoInts(a:Int, b:Int) -> Int{
    return a + b
}
var mathFunction:(Int,Int) -> Int = addTwoInts
print("\(mathFunction(3,4))")
  1. 函數(shù)作為參數(shù)類型
func printMathResult(math:(Int, Int) -> Int, a:Int, b:Int){
    print("\(math(a,b))")
}
func add(a:Int, b:Int) -> Int{
    return a + b
}
printMathResult(add,a:3,b:4)
  1. 函數(shù)作為返回類型
func stepForward(input:Int) -> Int{
    return input + 1
}
func stepBackward(input:Int) -> Int{
    return input - 1
}
func chooseStepFunction(backwards:Bool) -> (Int) -> Int{
    return backwards ?stepBackward :stepForward
}
//這里的x 是一個(gè)函數(shù)類型
let f1 = chooseStepFunction(true)
print("f1 = \(f1(3))")
  1. 嵌套函數(shù)
func chooseStepFunction(backwards:Bool) -> (Int) -> Int{
    func stepForward(input:Int) -> Int{return input + 1}
    func stepBackward(input:Int) -> Int{return input - 1}
    return backwards ?stepBackward :stepForward
}
//這里的x 是一個(gè)函數(shù)類型
let f1 = chooseStepFunction(true)
print("f1 = \(f1(3))")
  1. 閉包
    sortswift標(biāo)準(zhǔn)庫提供的方法 可以根據(jù)提供的排序規(guī)則對(duì)一個(gè)數(shù)組進(jìn)行排序 生成一個(gè)長度一致的新數(shù)組
    以下使用了閉包表達(dá)式和函數(shù)方式 實(shí)現(xiàn)了排序
func backwards(s1:String, s2:String) -> Bool{
    return s1 > s2
}
let names = ["C", "D", "E","A", "B"]
let sequenceNames = names.sort()
// let reversedNames = names.sort(backwards)
let reversedNames = names.sort({(s1:String, s2:String) -> Bool in 
    return s1 > s2
    })
print("sqquence Names:\(sequenceNames) \nreversed Names:\(reversedNames)")

因?yàn)?code>sort方法 明確定義了閉包的參數(shù) 返回值所以可以進(jìn)一步簡寫為

names.sort{s1,s2 in s1 > s2}

可以使用$0 $1 $2 順序表示閉包的參數(shù) 所以可以再簡寫為

names.sort({$0 > $1})

swift 中的String類型 定義了“>”的字符串實(shí)現(xiàn) 因此還可以簡寫為

names.sort(>)

不過 最好使用完整的閉包表達(dá)式 使代碼更具有更好的可讀性

  1. 尾隨閉包
    可以將一個(gè)閉包表達(dá)式作為函數(shù)的最后一個(gè)參數(shù)傳入來增強(qiáng)函數(shù)的可讀性
let digitNames = [
    "Zero","One", "Two", "Three", "Four", "Five",
    "Six", "Seven", "Eight", "Nine"
]
let numbers = [123,785,951]
let strings = numbers.map{
    (number) -> String in
    var outPut = ""
    var n = number
    while n > 0{
    outPut = digitNames[n%10] + outPut
    n = n / 10
    }
    return outPut
}
print("strings = \(strings)")
  1. 非逃逸閉包 自動(dòng)閉包
    這個(gè)現(xiàn)在看懂了
    @escaping逃逸閉包指的是閉包在函數(shù)返回后才執(zhí)行
    @noescaping則相反 在函數(shù)返回之前就執(zhí)行了
    @autoclosure指的是自動(dòng)創(chuàng)建的閉包,不能接受參數(shù),并且屬于非逃逸閉包 下邊是一個(gè)自動(dòng)閉包的例子昧互,
func printIfTrue(@autoclosure predicate: ()-> Bool){
    if predicate(){
        print("the result is true")
    }
}
 
printIfTrue(2 > 1)
//直接進(jìn)行調(diào)用了屹蚊,Swift 將會(huì)把 2 > 1 這個(gè)表達(dá)式自動(dòng)轉(zhuǎn)換為 () -> Bool。這樣我們就得到了一個(gè)寫法簡單睡榆,表意清楚的式子唱蒸。

  1. 遞歸枚舉求值
indirect enum ArithmeticExpression{
    case Number(Int)
    case Addition(ArithmeticExpression, ArithmeticExpression)
    case Mutiplication(ArithmeticExpression, ArithmeticExpression)
}
func evaluate(expression: ArithmeticExpression) -> Int{
    switch expression {
    case .Number(let value):return value
    case .Addition(let l, let r):return evaluate(l) + evaluate(r)
    case .Mutiplication(let l, let r):return evaluate(l) * evaluate(r)
    }
}
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addition(five, four)
let product = ArithmeticExpression.Mutiplication(sum, ArithmeticExpression.Number(2))
print("sum:\(evaluate(sum)) product:\(evaluate(product))")
  1. 下標(biāo)腳本
struct TimeTable {
    let multiplier:Int
    subscript(index:Int) -> Int {return multiplier * index}
}
let threeTimesTable = TimeTable(multiplier:3)
print("\(threeTimesTable[6])")
  1. 弱引用示例
//適用于弱引用的場景 weak
//公寓和人 room對(duì)jack的引用為弱引用 jack為nil之后 room并不會(huì)為nil 但jack不會(huì)對(duì)room產(chǎn)生強(qiáng)引用 room為nil 會(huì)釋放其所占內(nèi)存空間 并不會(huì)因?yàn)閖ack的引用而不釋放
class Person{
    let name: String
    var apartment:Apartment?
    init(name: String){self.name = name}
    deinit {print("Person is being deinitialized")}
}
class Apartment{
    let unit: String
    weak var tenant: Person?
    init(unit:String){self.unit = unit}
    deinit {print("Apartment is being deinitialized")}
}
var jack:Person?
var room:Apartment?
jack = Person(name:"jack")
room = Apartment(unit:"4A")
jack!.apartment = room
room!.tenant = jack
jack = nil
// room = nil
  1. 無主引用示例
//適用于無主引用的場景  unowned
//無主引用永遠(yuǎn)都是有值的
//CerditCard 中的 customer 為無主引用 當(dāng)customer為空(john=nil)時(shí) 不在有對(duì)CerditCard的引用 因此CerdutCard也釋放了
class CerditCard{
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer){self.number = number;self.customer = customer
    }
    deinit {print("CerditCard is being deinitialized")}
}
class Customer{
    let name:String
    var card: CerditCard?
    init(name: String){self.name = name}
    deinit{ print("Customer is being deinitialized")}
}
var john:Customer?
john = Customer(name:"john")
john!.card = CerditCard(number: 1234_5678_9012_3456, customer: john!)
john = nil
  1. 閉包當(dāng)中避免循環(huán)引用
class HTMLElement{
    let name: String
    let text: String?
    lazy var asHTML: Void -> String = {[unowned self] in 
if let text = self.text{return "<\(self.name)>\(text)</\(self.name)>"}else{return "<\(self.name)/>"}
    }
    init (name: String, text: String){self.name = name
self.text = text
}
    deinit{print("HTMLElement is being deinitialized")}
}
var paragraph: HTMLElement? = HTMLElement(name:"p", text:"hello world!")
print(paragraph!.asHTML())
paragraph = nil

在閉包和捕獲實(shí)例總是互相引用并且總是同時(shí)銷毀的 將閉包內(nèi)的捕獲定義為無主引用 相反 閉包內(nèi)的捕獲可能先銷毀的 應(yīng)該使用弱引用

  1. 使用reduce組合數(shù)組元素
let result = selectedSubjects.reduce("", combine: { (tempResult, element) -> String in return tempResult + " " + element})
  1. 錯(cuò)誤處理官方示例代碼
enum VendingMachineError: ErrorType{
    case InvalidSelection                       //選擇無效  
    case InsufficientFuncs(coinsNeeded: Int)    //金額不足
    case OutOfStock                             //缺貨
}
struct Item {
    var price: Int
    var count: Int
}
class VendingMachine{
    var inventory = [
"Candy Bar": Item(price: 12, count: 7),
"Chips": Item(price: 10, count: 10),
"Pretzels": Item(price: 7, count: 11)
    ]
    var coinsDeposited = 0
    func dispenseSnack(snack: String){
print("Dispensing \(snack)")
    }
    func vend(itemName name: String) throws{
guard var item = inventory[name] else{throw VendingMachineError.InvalidSelection}
guard item.count > 0 else{
throw VendingMachineError.OutOfStock}
guard item.price <= coinsDeposited else{throw VendingMachineError.InsufficientFuncs(coinsNeeded: item.price - coinsDeposited)}
coinsDeposited -= item.price
item.count -= 1
inventory[name] = item
dispenseSnack(name)
    }
}
let favoriteSnacks = [
    "Alice": "Chips",
    "Bob": "Licorice",
    "Eve": "Pretzels"
]
func buyFavoriteSnack(person: String, vendingMachine: VendingMachine) throws{
    let snackName = favoriteSnacks[person] ?? "Candy Bar"               //空合運(yùn)算符
    try vendingMachine.vend(itemName: snackName)
}
var vendingMachine = VendingMachine()
vendingMachine.coinsDeposited = 8
do{
    try buyFavoriteSnack("Alice", vendingMachine: vendingMachine)
}catch VendingMachineError.InvalidSelection{
    print("Invalid Selection")
}catch VendingMachineError.OutOfStock{
    print("out of stock.")
}catch VendingMachineError.InsufficientFuncs(let coinsNeeded){
    print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
}
  1. 嵌套類型示例代碼
struct BlackjackCard {
    enum Suit: Character{
case Spades = "??", Hearts = "??", Diamonds = "??", Clubs = "??"
    }
    enum Rank: Int{
case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King, Ace
struct Values{
let first: Int, second: Int?}
var values: Values{
switch self {
case Ace:
return Values(first: 1, second: 11)
case Jack, Queen, King:
return Values(first: 10, second: nil)
default:return Values(first: self.rawValue, second: nil)
}}
}
let rank: Rank, suit: Suit
var description: String{
var output = "suit is \(suit.rawValue),"
output += "value is \(rank.values.first) "
if let second = rank.values.second{
    output += "or \(second)"
}
return output
    }
}
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
print("theAceOfSpades:\(theAceOfSpades.description)")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敷矫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子低矮,更是在濱河造成了極大的恐慌印叁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军掂,死亡現(xiàn)場離奇詭異轮蜕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝗锥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門跃洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人终议,你說我怎么就攤上這事汇竭〈谢龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵细燎,是天一觀的道長两曼。 經(jīng)常有香客問我,道長玻驻,這世上最難降的妖魔是什么悼凑? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮璧瞬,結(jié)果婚禮上户辫,老公的妹妹穿的比我還像新娘。我一直安慰自己嗤锉,他們只是感情好渔欢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘟忱,像睡著了一般膘茎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酷誓,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天披坏,我揣著相機(jī)與錄音,去河邊找鬼盐数。 笑死棒拂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玫氢。 我是一名探鬼主播帚屉,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漾峡!你這毒婦竟也來了攻旦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤生逸,失蹤者是張志新(化名)和其女友劉穎牢屋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體槽袄,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙无,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遍尺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片截酷。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乾戏,靈堂內(nèi)的尸體忽然破棺而出迂苛,到底是詐尸還是另有隱情三热,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布三幻,位于F島的核電站康铭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赌髓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一催跪、第九天 我趴在偏房一處隱蔽的房頂上張望锁蠕。 院中可真熱鬧,春花似錦懊蒸、人聲如沸荣倾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌仍。三九已至,卻和暖如春通危,著一層夾襖步出監(jiān)牢的瞬間铸豁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工菊碟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留节芥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓逆害,卻偏偏與公主長得像头镊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魄幕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,838評(píng)論 0 6
  • 86.復(fù)合 Cases 共享相同代碼塊的多個(gè)switch 分支 分支可以合并, 寫在分支后用逗號(hào)分開相艇。如果任何模式...
    無灃閱讀 1,373評(píng)論 1 5
  • Swift 介紹 簡介 Swift 語言由蘋果公司在 2014 年推出,用來撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,225評(píng)論 3 25
  • 2014年的蘋果全球開發(fā)者大會(huì)(WWDC)纯陨,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,294評(píng)論 0 9
  • 126.析構(gòu)器 在一個(gè)類實(shí)例銷毀前,一個(gè)析構(gòu)器會(huì)立即調(diào)用坛芽。使用deinit 關(guān)鍵字來表示析構(gòu)器, 跟構(gòu)造器寫法類似...
    無灃閱讀 804評(píng)論 0 4