調用泛型類型符合約定的一個靜態方法來一個協議說我有:如何斯威夫特
@objc public protocol InteractivelyNameable: Nameable {
static func alertViewForNaming(_ existingObject: Nameable?,
context: NSManagedObjectContext,
completion:@escaping ((_ success: Bool, _ object: Nameable?, _ didCancel: Bool, _ error: Error?) -> Void)) -> UIAlertController?
}
而且我有一個管理各種類型的(通用型是.fetchableObjectType一個通用的視圖控制器...基本上是NSManagedObject.self
..好吧,它的一個子類)。我需要檢查一個特定的對象類型是否符合協議,如果是,請調用它。
類似:
// valid swift code
if self.dataSource.fetchableObjectType is InteractivelyNameable {
// not valid swift code
if let alert = (self.dataSource.fetchableObjectType as! InteractivelyNameable).alertViewForNaming(....) { // ... do stuff }
}
你的一種方法看起來不錯。 這是如何工作在我想要完成的範圍內?想象一下NSFetchedResultsController管理NSManagedObject的特定子類。所以我知道它正在管理的對象的類型,但是說我沒有實例。我想知道它的類是否符合InteractivelyNameable,如果是,請給我一個UIAlertController。 – horseshoe7
我認爲你的問題是你使用具體類型。你不應該使用具體的類型,例如,使用一個Nameable協議的數組,這樣你就知道實際的協議類型。當然,如果你使用具體類型,你將有類型問題驗證。您在回答中寫入的解決方案違反了來自SOLID btw的LSP原理。 – OhadM
SOLID中的LSP原理究竟是什麼? 我現在必須使用混凝土類型。 – horseshoe7