调用泛型类型符合约定的一个静态方法来一个协议说我有:如何斯威夫特
@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