位置:首頁 > 高級語言 > Swift教學 > Swift檢驗協議的一致性

Swift檢驗協議的一致性

檢驗協議的一致性

使用is檢驗協議一致性,使用as將協議類型向下轉換(downcast)為的其他協議類型。檢驗與轉換的語法和之前相同(詳情查看類型檢查):

  • is操作符用來檢查實例是否遵循了某個協議
  • as?返回一個可選值,當實例遵循協議時,返回該協議類型;否則返回nil
  • as用以強製向下轉換型。
@objc protocol HasArea {
    var area: Double { get }
}


注意: @objc用來表示協議是可選的,也可以用來表示暴露給Objective-C的代碼,此外,@objc型協議隻對有效,因此隻能在中檢查協議的一致性。詳情查看Using Siwft with Cocoa and Objectivei-c
 

class Circle: HasArea {
    let pi = 3.1415927
    var radius: Double
    var area:≈radius }
    init(radius: Double) { self.radius = radius }
}
class Country: HasArea {
    var area: Double
    init(area: Double) { self.area = area }
}

CircleCountry都遵循了HasArea協議,前者把area寫為計算型屬性(computed property),後者則把area寫為存儲型屬性(stored property)。

如下所示,Animal類冇有實現任何協議

class Animal {
    var legs: Int
    init(legs: Int) { self.legs = legs }
}

Circle,Country,Animal並冇有一個相同的基類,所以采用AnyObject類型的數組來裝載在它們的實例,如下所示:

let objects: AnyObject[] = [
    Circle(radius: 2.0),
    Country(area: 243_610),
    Animal(legs: 4)
]

如下所示,在迭代時檢查object數組的元素是否遵循HasArea協議:

for object in objects {
    if let objectWithArea = object as? HasArea {
        println("Area is \(objectWithArea.area)")
    } else {
        println("Something that doesn't have an area")
    }
}
// Area is 12.5663708
// Area is 243610.0
// Something that doesn't have an area

當數組中的元素遵循HasArea協議時,通過as?操作符將其可選綁定(optional binding)objectWithArea常量上。

objects數組中元素的類型並不會因為向下轉型而改變,當它們被賦值給objectWithArea時隻被視為HasArea類型,因此隻有area屬性能夠被訪問。