派生类不符合协议

时间:2014-12-24 06:14:50

标签: swift

    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。我错过了什么?所有这些代码都可以粘贴在游乐场

2 个答案:

答案 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已经处理过这个问题。这似乎是一种迂回的做事方式。