[英]Derived class doesn't conform to protocol
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。 我错过了什么? 所有这些代码都可以粘贴在游乐场中
它看起来像一个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 { }
^^^^^^^^^^
这绝对是个错误。 我找到的另一种解决方法是让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
已经处理过MyBaseClass
。 这似乎是一种迂回的做事方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.