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
。