[英]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.