我在項目中有兩個版本的相同模型(並且我無法擺脫舊版本)。它是Customer
(遺留代碼)和結構CustomerModel
- 現代Swift模型的實現。通過擴展使現有Objective C類符合swift協議
我有一個自定義UITableViewCell
它曾經有setup(withCustomer: CustomerModel)
方法。它適用於新模型,但現在我需要使用傳統模型來設置相同的單元格。
我決定定義CustomerDisplayable
協議,並使兩種模型都符合它。
下面是代碼:
Customer.h
@interface Customer : NSObject
@property (nonatomic, strong) NSString* name;
@property (nonatomic, strong) NSString* details;
@end
CustomerModel.swift
struct CustomerModel {
let name: String
let details: String?
init(withJSON json: [String: Any]) {
name = json["name"] as! String
details = json["details"] as? String
}
}
CustomerDisplayable.swift
protocol CustomerDisplayable {
var name: String { get }
var details: String? { get }
var reviewCount: Int { get }
var reviewRating: Double { get }
}
extension Customer: CustomerDisplayable {
var reviewCount: Int { return 100 }
var reviewRating: Double { return 4.5 }
}
extension CustomerModel: CustomerDisplayable {
var reviewCount: Int { return 100 }
var reviewRating: Double { return 4.5 }
}
我預計隨着Customer.h早已性質name
& details
- 這將符合本協議及以上的擴展將正常工作。但是在我的擴展中出現編譯錯誤: 類型'客戶'不符合協議'CustomerDisplayable'。
Xcode提供了一個快速修復 - 協議要求屬性'名稱'類型'字符串';你想添加一個存根。 如果我同意的Xcode添加存根我結束了name
和details
可計算的干將,但Xcode中顯示新的編譯錯誤:
extension Customer: CustomerDisplayable {
var details: String? {
return "test"
}
var name: String {
return "test"
}
var reviewCount: Int { return 100 }
var reviewRating: Double { return 4.5 }
}
- 「細節」與目標自身的類型
- 消氣爲「名」內使用-C選擇器'名稱'與以前的聲明衝突與相同的Objective-C選擇器
任何想法如何解決這個問題?我真的想爲這兩種模型表示擁有這個協議和抽象接口。 我唯一的解決方案是重命名屬性CustomerDisplayable
注意:真正的模型要複雜得多,但是這段代碼正在演示這個問題。
沒有鴨子快速打字,所以你確實必須重新命名你的領域。 – algrid