[英]how to extend a swift protocol with an extension so that classes get an implemented variable defined by the protocol
以下class:
class User {
var name = "Max"
var surname = "Mustermann"
}
和以下協議:
protocol Sharable {
func share(name: String)
var isSharable: Bool { get set }
}
以某種方式擴展協議sharable
,以便User
的子類獲得share(:)
和isSharable
的實現版本。
以下擴展嘗試執行此操作:
extension Sharable where Self: User {
func share(name: String) { print(name) }
var isSharable: Bool { return !name.isEmpty }
}
創建的子類Admin
應該免費獲得Sharable
的所有功能,而無需存儲和實現變量和函數。
class Admin: User, Sharable {
}
但是 Xcode 會打印錯誤:
“管理員”不符合“可共享”協議
Xcode 提出以下建議:
class Admin: User, Sharable {
var isSharable: Bool
}
現在 Xcode 打印錯誤:
class 'Admin' 沒有初始化器
有沒有辦法擴展協議Sharable
以便Admin
有一個變量isSharable
而不定義或初始化它? 基本上就像它與 function share(:)
一樣,它不必由子類實現,因為它是由擴展實現的。
class ArbitraryObject: User, Sharable {
// no implementation or initializing of isSharable or share(:)
}
let arbitraryObject = ArbitraryObject()
if arbitraryObject.isSharable {
arbitraryObject.share(name: arbitraryObject.name)
}
目前您的協議將isSharable
定義為{ get set }
protocol Sharable {
func share(name: String)
var isSharable: Bool { get set }
}
這意味着當您構建擴展時,它實際上並不符合協議
extension Sharable where Self: User {
func share(name: String) { print(name) }
var isSharable: Bool { return !name.isEmpty }
}
這是因為您已在擴展中將isSharable
定義為計算屬性。 計算屬性只能get
。
您可以通過刪除set
要求使您的擴展符合Sharable
協議。 所以你的協議會變成:
protocol Sharable {
func share(name: String)
var isSharable: Bool { get }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.