如果需要實現已被廢棄的 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選單,彈出對...