Swift語言程式設計技巧集

2021-07-16 16:47:05 字數 4479 閱讀 5149

如果需要實現已被廢棄的 var 引數的功能(在函式內部修改引數值,函式外部不可見),可以採用宣告變數覆蓋同名引數的辦法

func f(i: int) 

let x = 3

f(x)

// x == 3

試比較:
func f(i: inout int) 

var x = 3

f(&x)

// x == 4

無引數的閉包在形式上可以和**塊相同,需要根據上下文加以區分。

let a = 3

let f1 = // 閉包

let f2 = // 閉包

let f3 = // 閉包

let f4 = // 閉包

let f5 = // 閉包(形式上和**塊相同)

let f6 = // 閉包(形式上和**塊相同)

func f7() -> bool

let b = f1() || f2() || f3() || f4() || f5() || f6() || f7()

// b == false

introducing protocol-oriented programming in swift 2

將 mixin 實現為協議。

通過協議擴充套件來為 mixin 提供預設實現。

採納該協議以完成 mixin 功能。

protocol samplemixin 

func samplemethod()

}extension samplemixin

func samplemethod()

}class sampleclass : samplemixin {}

let c = sampleclass()

c.samplemethod() // default implementation

print(c.sampleproperty) // 42

// n的值為a,b,c,4當中第乙個不是nil的數

let n = a ?? b ?? c ?? 4

abc

n1//

1nil2/

2nil

nil3

3nil

nilnil

4

// n的值為a.b.c,條件是a,a.b,a.b.c都不是nil。否則n的值為4。

let n = a?.b?.c ?? 4

a

a.ba.b.c

nnil//

4  != nil

nil/

4!= nil

!= nil

nil4

!= nil

!= nil33

模式匹配並不僅僅侷限於switch語句,在if,guard以及for語句中也能進行模式匹配。

swift 2: pattern matching with 「if case」

pattern matching, part 4: if case, guard case, for case

// if case語句實現模式匹配

enum media

let m = media.movie(title: "captain america: civil war", director: "russo brothers", year: 2016)

if case let media.movie(title, _, _) = m

// 相當於

switch m

// if case語句實現模式匹配

if case 1...255 = x {}

// 相當於

if 1 <= x && x <= 255 {}

// pattern ~= value

if 1...255 ~= x && 1...255 ~= y {}

// 相當於

if 1 <= x && x <= 255 && 1 <= y && y <= 255 {}

在if guard 語句中逗號相當於與運算
if case 1...255 = x, case 1...255 = y {}

if 1...255 ~= x, 1...255 ~= y {}

// 相當於

if 1...255 ~= x && 1...255 ~= y {}

需要新開乙個作用域時,不能像其他c系列語言那樣直接寫大括號,不然會出現如下錯誤:

statement cannot begin with a closure expression(語句不能以閉包表示式開頭)

正確方法是使用不帶 catch 的 do 語句。

defer語句在當前作用域即將結束時執行指定的**塊,相當於其他語言的try...finally。

如果某個作用域內存在多個defer語句時,該作用域即將結束時排在後面的defer語句所指定的**塊先執行,排在前面的defer語句所指定的**塊後執行。

the defer keyword in swift 2: try/finally done right

// do語句 + defer語句

print("step 1")

do defer

print("step 4")

print("step 5")

}print("step 6")

/*step 1

step 4

step 5

step 3

step 2

step 6

*/

使用 public private(set) 建立 public 唯讀 private 可寫的變數。

public read-only variables

// private(set)

public class person

// 宣告並交換兩個變數的值

var (a, b) = (1, 2) // a == 1, b == 2

(a, b) = (b, a) // a == 2, b == 1

// 相當於

var a = 1, b = 2

let temp = a; a = b; b = temp

// 比較兩對值

if (a1, b1) == (a2, b2) {}

if (a1, b1) < (a2, b2) {}

// 相當於

if a1 == a2 && b1 == b2 {}

if a1 < a2 || a1 == a2 && b1 < b2 {}

// 比較三對值

if (a1, b1, c1) == (a2, b2, c2) {}

if (a1, b1, c1) < (a2, b2, c2) {}

// 相當於

if a1 == a2 && b1 == b2 && c1 == c2 {}

if a1 < a2 || a1 == a2 && b1 < b2 || a1 == a2 && b1 == b2 && c1 < c2 {}

使用元組+模式匹配或者字串形式來比較兩個帶相關值的列舉。

how to test equality of swift enums with associated values

// 比較兩個帶相關值的列舉

enum ******token : equatable

let t1 = ******token.number(123) // the string representation is "number(123)"

let t2 = ******token.number(123)

let t3 = ******token.name("bob") // the string representation is "name(\"bob\")"

// 字串形式

print(string(describing: t1) == string(describing: t2)) // true

print(string(describing: t1) == string(describing: t3)) // false

// 元組+模式匹配

func == (lhs: ******token, rhs: ******token) -> bool

}print(t1 == t2) // true

print(t1 == t3) // false

swift 中最短的空語句不是分號而是一對小括號。

switch true 

{}()

break

}

翻譯 Swift程式語言 關於Swift

swift是一門用於ios和os x應用開發的新的程式語言,它以c和objective c語言為基礎,但沒有c語言的相容性約束。swift採用了安全的程式設計模式並且新增了能夠讓程式設計更加簡單 靈活和富有樂趣的現代化特性。swift是白紙一張,再加上有成熟而且深受喜愛的cocoa和cocoatou...

Swift程式語言初探

繼wwdc2014後,新的程式語言swift浮出水面。它具有高速 現代 安全 可互動等特徵,而且其語法簡單,入門門檻低,有望替代語法複雜難懂的objective c語言。據其作者chris lattner在部落格上聲稱,該語言開發僅僅用了4年時間。而且底層框架基本上都是由其一人開發完畢。依照慣例,先...

VC程式設計技巧錦集

問題一 解決workspace中的classview顯示混亂 解答 即新增的成員變數或函式不能顯示 即使顯示出來了變數或函式,雙擊後不能跳至正確的位置。刪除.ncb檔案,再rebuild all,即可。問題二 向專案中加入自己定義的類的簡單方法 解答 選擇insert new class選單,彈出對...