import Foundation
import Swift
struct HasType<Type: AnyObject> {
static func inObject<T>(object: T) -> Bool {
return object is Type
}
}
@objc protocol MyBaseProtocol : class {}
@objc protocol MyDerivedProtocol : MyBaseProtocol {}
@objc class MyBaseClass : MyDerivedProtocol {}
@objc class MyDerivedClass : MyBaseClass {}
let mbc = MyBaseClass()
let mdc = MyDerivedClass()
HasType<MyBaseProtocol>.inObject(mbc) // True
HasType<MyDerivedProtocol>.inObject(mbc) // True
HasType<MyBaseProtocol>.inObject(mdc) // False
HasType<MyDerivedProtocol>.inObject(mdc) // False
HasType<MyBaseClass>.inObject(mdc) // True
HasType<MyDerivedClass>.inObject(mdc) // True
为什么此方法返回2 False。我期待All True。我错过了什么?所有这些代码都可以粘贴在游乐场
答案 0 :(得分:1)
它看起来像一个bug。问题可以简化为:
@objc protocol MyProtocol {}
class MyBaseClass : MyProtocol {}
class MyDerivedClass : MyBaseClass {}
let mbc:AnyObject = MyBaseClass()
let mdc:AnyObject = MyDerivedClass()
mbc is MyProtocol // -> true
mdc is MyProtocol // -> false
解决方法是让MyBaseClass
继承自NSObject
class MyBaseClass : NSObject, MyProtocol { }
^^^^^^^^^^
答案 1 :(得分:0)
这绝对是个错误。我找到的另一种解决方法是让MyDerivedClass符合MyDeriveProtocol。 class MyDerivedClass : MyBaseClass, MyDerivedProtocol {}
import UIKit
import Foundation
struct HasType<Type: AnyObject> {
static func inObject<T>(object: T) -> Bool {
return object is Type
}
}
@objc protocol MyBaseProtocol {
func someValue() -> Double
}
@objc protocol MyDerivedProtocol : MyBaseProtocol{}
@objc class MyBaseClass : MyDerivedProtocol {
func someValue() -> Double { return 9.9 }
}
@objc class MyDerivedClass : MyBaseClass, MyDerivedProtocol {}
let mbc = MyBaseClass()
let mdc = MyDerivedClass()
mdc.someValue()
HasType<MyBaseProtocol>.inObject(mbc) // True
HasType<MyDerivedProtocol>.inObject(mbc) // True
HasType<MyBaseProtocol>.inObject(mdc) // true
HasType<MyDerivedProtocol>.inObject(mdc) // true
HasType<MyBaseClass>.inObject(mdc) // True
HasType<MyDerivedClass>.inObject(mdc) // True
请注意,您不必重新实现MyDerivedProtocol
方法和要求,因为MyBaseClass
已经处理过这个问题。这似乎是一种迂回的做事方式。