在32位CPU上(iphone5及之前)是Int32,64位上(5s及之後)爲Int64。UInt同理。html
可選鏈式調用失敗時,等號右側的代碼不會被執行objective-c
func createAddress() -> Address { print("Function was called.") return Address() } john.residence?.address = createAddress() // 不會輸出打印
autoclosure能夠把表達式轉化爲閉包。swift
func judgeLog(@autoclosure predicate: () -> Bool, msg: String) { if predicate() { print(msg) } } judgeLog(2>1, msg: "2 > 1 is right")
assert是Debug時才起效,Release下不起效。而fatalError不管哪一種狀況都起效。能夠按照需求來選擇錯誤奔潰處理。閉包
mutating修飾方法,用在struct,enum這些值類型中,他們的方法中修改屬性必須使用mutating。架構
在添加自定義操做符時,分別加上infix表示中位符 prefix前位符 postfix後位符。dom
infix operator +* { associativity none //結合律, precedence 160 //優先級,乘除爲150,加減爲140 } // 重載+* func +* (left: Int, right: Int) -> Int { return (left * right + left + right) }
函數的參數默認是let,若是有時候須要修改傳入的變量的值,須要添加inout關鍵字。yii
designated初始化方法就是最普通的init方法。designated方法必須確保全部成員對象被初始化了。
初始化方法中依賴其餘初始化方法,必須使用convenience。若父類實現了convenicence init那麼子類能夠直接使用父類這個方法來初始化。
required是強制子類必須重寫的關鍵字。iphone
init後加"?"或"!"容許在初始化中返回nil來實例化optional對象。ide
let mixed1: [Any] = [1, "two", 3.0] let mixed2 = [1, "two", 3.0] // [NSObject] enum IntOrString { case IntValue(Int) case StringValue(String) } let mixed3 = [IntOrString.IntValue(1), IntOrString.StringValue("haha")]
protocol Copyable { func copy() -> Self } class MyClass: Copyable { var num: Int required init(num: Int) { self.num = num } func copy() -> Self { let result = self.dynamicType.init(num: self.num) return result } }
let aNil: String? = nil let bNil: String?? = aNil let cNil: String?? = nil // bNil不等於cNil
運行時,lldb調試直接使用po指令能夠打印對象的值 (po = print object)
使用bt能夠打印出現場堆棧信息
使用fr v xxx打印楨信息,"fr v -R xxx"來打印多重變量信息函數
let arr = [1,2,3] let doubled = arr.map({ $0 * 2 }) print(doubled) // [2, 4, 6] let num: Int? = 6 let result1 = num.map { $0 * 2 } print(result1) // Optional(12)
let name = ["li ming", "wang hao", "xiao bai"] name.forEach { (_name) in switch _name { case let x where x.hasPrefix("xiao"): print("[\(x)] is my family") default: print("[\(_name)] is not my family") } } let score: [Int?] = [99, 100, nil, 60] score.forEach { if let s = $0 where s == 100 { print("you are so smart!") } }
在拓展中也能夠這麼使用
extension Array where Element: Integer { // ... }
實例方法是被類型的某個實例調用的方法。你也能夠定義類型自己調用的方法,這種方法就叫作類型方法。只須要在func前添加class。類型方法內部self指向這個類型自己,而不是類型的某個實例。
class MyClass { class func method() {} } MyClass.method()
class MyClass { func method(number: Int) -> Int { return number + 1 } } let f = MyClass.method // 等價於let f = { (obj: MyClass) in obj.method } let object = MyClass() let result = f(object)(1) // 2
若是加入重載和類方法:
class MyClass { class func method(number: Int) -> Int { // #1 return number } func method(number: Int) -> Int { // #2 return number + 1 } func method(numberA: Int, numberB: Int) -> Int { // #3 return numberA + numberB } } let f0 = MyClass.method // 等價於類型方法 #1 let f1: Int -> Int = MyClass.method // 等價於f0 let f2: MyClass -> Int -> Int = MyClass.method // #2 let f3: MyClass -> (Int, Int) -> Int = MyClass.method // #3 let object = MyClass() let result0 = f0(1) // 1 let result1 = f1(1) // 1 let result2 = f2(object)(1) // 2 let result3 = f3(object)(2,2) // 4
#if <condition> // ... #elseif <condition> // ... #else // ... #endif
條件能夠是os(OSX)/os(iOS),arch(x86_64)/arch(arm)/arch(arm64)/arch(i386)
也能夠是自定義的一個條件變量:Build Settings->Swift Compiler->Custom Flags添加-D CONDITION_NAME
// # 1 使用objective-c方式 @objc protocol OptionalProtocol { optional func optionalMethod() func necessaryMethod() } // # 2 使用接口拓展 protocol OptionalProtocol { func optionalMethod() func necessaryMethod() } extension OptionalProtocol { func optionalMethod() {} }
使用arc4random_uniform(arc4random在32位iPhone上有時程序奔潰)
// # 1 let maxValue: UInt32 = 10 print(Int(arc4random_uniform(maxValue)) + 1) // # 2 func randomInRange(range: Range<Int>) -> Int { let count = UInt32(range.endIndex - range.startIndex) return Int(arc4random_uniform(count)) + range.startIndex } for _ in 1...10 { print(randomInRange(1...10)) }