簡體   English   中英

如何使用擴展擴展 swift 協議,以便類獲得協議定義的實現變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM