我正在尝试比较两个Any.Type
。
我想要检查的是某种类型是否等于 OR 继承该类型。
EG。 UIView
类型为UIView.Type
,但它也继承自NSObject.Type
。
我有问题要检查第二个。
Swift可以吗?
〔实施例:
class Object: NSObject {
var name: String = "aloha"
}
class Other {
var obj: Object?
}
let key = \Other.obj
let keyType = type(of: key)
keyType.valueType == Object?.self // true
keyType.valueType == NSObject.self // false - how can I make it true?
我的最终目标是使用通用VC来编辑任何(CoreData)对象。我想根据var的类型显示不同的单元格。 我找到了一种不同的方式来实现我上面描述的内容(我希望 - 更好的方法)。 我仍然在这里遇到一个问题。虽然我终于可以找到对象的类型,但我想检查该类型是否符合我的协议,如果是,则调用其方法。 示例代码可能会更好地解释它:
protocol MyProtocol: class {
static func someIdentifier() -> String
}
class Object: NSObject, MyProtocol {
var name: String = "aloha"
static func someIdentifier() -> String {
return "This is it!"
}
}
class Other: NSObject {
var obj: Object?
}
let key = \Other.obj
let keyType = type(of: key)
let other = Other()
let value: Any? = other[keyPath: key]
if let object = value as? NSObject? {
if let protocolObject = object as? MyProtocol {
print("Yey!") // Can't get here :< What should I do to be able to call methods of MyProtocol?
// protocolObject.myIdentifier() // :< How?
}
}
答案 0 :(得分:0)
你 无法到达 ,因为value
又名obj
是nil
。
请看这个。我将someIdentifier()
更改为实例方法,并将Object
实例分配给obj
。此外,我删除了不必要的类型注释let value: Any?
,因为从Object
转换为Any
的类型使其更糟,并通过删除第二个问号来合并可选的向下转换if let object = value as NSObject?
。 / p>
protocol MyProtocol: class {
func someIdentifier() -> String
}
class Object: NSObject, MyProtocol {
var name: String = "aloha"
func someIdentifier() -> String {
return "This is it!"
}
}
class Other: NSObject {
var obj: Object?
}
let key = \Other.obj
let keyType = type(of: key)
let other = Other()
other.obj = Object()
let value = other[keyPath: key]
if let object = value as NSObject? {
if let protocolObject = object as? MyProtocol {
print(protocolObject.someIdentifier()) // This is it!
}
}