簡體   English   中英

派生類不符合協議

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM