2014-12-24 55 views
3
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個假。我期待All True。我錯過了什麼?所有這些代碼可以在操場上派生類不符合協議

回答

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 

的解決方法是從NSObject

class MyBaseClass : NSObject, MyProtocol { } 
        ^^^^^^^^^^ 
0

使MyBaseClass繼承這絕對是一個錯誤:因爲這個問題可以簡化。我發現的另一個解決方法是使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已經照顧。這似乎是一種迂迴的做事方式。

相關問題