位置:首頁 > 高級語言 > Swift教學 > Swift屬性要求

Swift屬性要求

屬性要求

協議能夠要求其遵循者必須含有一些特定名稱和類型實例屬性(instance property)類屬性 (type property),也能夠要求屬性具有(設置權限)settable 和(訪問權限)gettable,但它不要求屬性存儲型屬性(stored property)還是計算型屬性(calculate property)

如果協議要求屬性具有設置權限和訪問權限,那常量存儲型屬性或者隻讀計算型屬性都無法滿足此要求。如果協議隻要求屬性具有訪問權限,那任何類型的屬性都可以滿足此要求,無論這些屬性是否具有設置權限。

通常前置var關鍵字將屬性聲明為變量。在屬性聲明後寫上{ get set }表示屬性為可讀寫的。{ get }用來表示屬性為可讀的。即使你為可讀的屬性實現了setter方法,它也不會出錯。

protocol SomeProtocol {
    var musBeSettable : Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

用類來實現協議時,使用class關鍵字來表示該屬性為類成員;用結構體或枚舉實現協議時,則使用static關鍵字來表示:

protocol AnotherProtocol {
    class var someTypeProperty: Int { get set }
}

protocol FullyNamed {
    var fullName: String { get }
}

FullyNamed協議含有fullName屬性。因此其遵循者必須含有一個名為fullName,類型為String的可讀屬性。

struct Person: FullyNamed{
    var fullName: String
}
let john = Person(fullName: "John Appleseed")
//john.fullName 為 "John Appleseed"

Person結構體含有一個名為fullName存儲型屬性,完整的遵循了協議。(若協議未被完整遵循,編譯時則會報錯)。

如下所示,Startship遵循FullyNamed協議:

class Starship: FullyNamed {
    var prefix: String?
    var name: String
    init(name: String, prefix: String? = nil ) {
        self.anme = name
        self.prefix = prefix
    }
    var fullName: String {
    return (prefix ? prefix ! + " " : " ") + name
    }
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName == "USS Enterprise"

Starship類將fullName實現為可讀的計算型屬性。它的每一個實例都有一個名為name的必備屬性和一個名為prefix的可選屬性。 當prefix存在時,將prefix插入到name之前來為Starship構建fullName