第二章-The Swift Language

Swift 中的類型


Swift 中的類型可以分為 3 組, 結構體、類和枚舉。這三個都有:

  • 屬性: 和類型關聯的值
  • 初始化函數: 初始化類型的實例的代碼
  • 實例方法: 在該類型的實例上調用的指定函數
  • 類方法或靜態方法: 在類型自身上調用的指定函數
// Structs

struct myStruct {
    // properties
    // initializers
    // methods
}

// Enumerations
enum MyEnum {
    // properties
    // initializers
    // methods
}

// Classes
class Myclass: SuperClass {
    // properties
    // initializers
    // methods
}

Swift 的結構體和枚舉比其它語言中的都要強大, 還能遵守協議并且能被擴展。

集合類型


數組類型寫作 Array<T>, T是數組將會包含的元素的類型。數組能包含任意類型的元素: 標準類型、結構體或類。

var hasPet: Bool
var arrayOfInts: Array<Int> // 聲明一個整數數組
var arrayOfInts: [Int]      // 簡寫語法

字典的鍵可以是任意類型, 但是必須是唯一的。也就是說鍵必須是可哈希的。基本 Swift 類型例如 IntFloatCharacterString 都是可哈希的。鍵值可以是任意類型。

var dictionaryOfString: Dictionary<String, String>  // 正式寫法
var dictionaryOfString: [String, String]            // 簡寫形式

集合的成員必須是唯一的和可哈希的。

var winningLotteryNumbers: Set<Int>

初始化函數


創建實例的一種方式是使用字面量; 另一種方式是使用類型的初始化函數。使用類型名后跟一對兒圓括號(或加上參數)語法來創建類型的實例。

let emptyString = Stirng()          // ""
let emptyArrayOgInts = [Int]()      // 0 elements
let emptySetOfFloats = Set<Float>() // 0 elements

其它類型有默認值:

let defaultNumber = Int()  // 0 
let defaultBool   = Bool() // false

類型可以有多個初始化函數。例如, String 有一個初始化函數接收一個 Int 類型的參數并基于該參數創建一個字符串。

let number = 42 // 42
let meanningOfLift = String(number)  // "42"

使用 Set 初始化函數接收一個數組字面量來創建一個set:

let availableRooms = Set([205, 411, 412])  // {412, 205, 411}

Float 有幾個初始化函數。不帶參數的初始化函數返回帶有默認值的Float實例。還有一個初始化函數接收一個浮點數字面量。

let defaultFloat = Float()          // 0.0 
let floatFromLiteral = Float(3.14)  // 3.14

如果你為浮點數字面量使用類型推斷, 那么類型默認為Double

let  easyPi = 3.14

Optionals


Swift 的類型可以是 optional, 即在類型的名字的后面加上一個 ?

var anOptionalFloat: Float?
var anOptionalArrayOfStrings: [String]?
var anOptionalArrayOfOptionalStrings: [String?]?

optional 的值要么是一個指定的實例要么是 nil。

for…in 循環


添加迭代約束


for i in 1...10 where i % 2 == 0 {
    // 只迭代偶數
    print("\(i) 是偶數")
}

where 可以換行:

for word in ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur"]
    where word.characters.count > 5 {
        print(word, "is a long word")
}

where 從句可以足夠復雜:

for i in 1...50 where i > 20 && i < 30 && (i % 2 == 0) {
      print("\(i) 是偶數")
}

處理 non-nil 項


Optionals 是很多 Swift 開發場景中的自然輸出, 例如在集合上映射一個函數或檢索潛在的可失敗資產。

你可以使用 Swift2的 .Somecase 簡寫來遍歷那些不是 nil 值的項:

let items: [String?] = [nil, nil, "Hello", nil, "World"]
for case let item? in items {
    print(item)
}

你綁定的項在 for 循環子句中被解包, 所以你可以直接使用它。

條件轉換


Swift 允許你使用條件轉換來過濾屬于指定父類的異種對象的列表。這兒有個提取 UIView 的例子:

let mySwitch = UISwitch()
let myView   = UIView()
let myDate   = NSDate()

let myItems: [NSObject] = [mySwitch, myDate, myView]
for case let item as UIView in myItems {
    print(item.frame)
}

這個方法在協議身上也適用。這兒有個超不自然的 case 來描述這個方法:

protocol MyCustomProtocol {
    var frame: CGRect {get}
}
struct Bar {}
struct Foo: MyCustomProtocol {
    let frame: CGRect = .zero
}
extension UIView: MyCustomProtocol {}

let otherItems = [Bar(), Foo(), UIView()] as [Any]
for case let item as MyCustomProtocol in otherItems {
    print(item.frame)
}

for var


for var x in 1...3 {
    x += 3
    print(x)
}

// 4,5,6

Swift 3 消除了所有的 for-var 結構。

替換

for var x in 1...5 { ... }

for x in 1...5 { var x = x; ... }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容