簡體   English   中英

AnyObject在Xcode8 beta6中不起作用?

[英]AnyObject not working in Xcode8 beta6?

在Xcode8 beta6中,以下代碼將引發警告:'is'測試始終為true。 但是它不會打印通行證。

    struct TestStruct {
    }

    //warning: 'is' test is always true
    if TestStruct() is AnyObject {
        print("pass")
    }

並且以下代碼將引起警告:從“ T”到“ AnyObject”的條件強制轉換始終成功

public static func register<T>(_ protocolType: T.Type, observer: T) {

    //Warning: Conditional cast from 'T' to 'AnyObject' always succeeds
    guard let object = observer as? AnyObject else {
        fatalError("expecting reference type but found value type: \(observer)")
    }
    //...
}

該警告按預期方式起作用: TestStruct() is AnyObjectfalse返回TestStruct() is AnyObject ,但不是

此答案的先前版本認為有警告,

'是'測試總是正確的

作為錯誤,並討論了為什么會出現這種錯誤的警告。 TestStruct() is AnyObject在運行時TestStruct() is AnyObject評估為false ,但是被認為是預期的行為。

給定由OP(SR-2420)提交錯誤報告的注釋,情況似乎是相反的:由於Xcode 8 / beta 6, is測試應該始終評估為true ,而OP:s發布的錯誤是TestStruct() is AnyObject的事實在運行時評估為false

喬·格羅夫寫道

這是正確的,因為現在所有內容都橋接到AnyObject

...

is /, as AnyObject現在對於所有類型總是成功的。 它的行為符合預期。


新的SwiftValue框,用於從Swift值轉換為Obj-C對象

(有關其他詳細信息,請參閱下面的評論中的討論,感謝@MartinR)

似乎沒有顯式實現的Swift值可以通過與_ObjectiveCBridgeable一致性(例如,有關_ObjectiveCBridgeable詳細信息,請參見下面的問答 ),可以自動地使用新的SwiftValue框來允許轉換為Obj-C對象。

swift / stdlib / public / runtime / SwiftValue.mm的初始提交消息為:

運行時:實現一個不透明的“ SwiftValue” ObjC類來保存橋接值

如果沒有更好的將Swift值映射到Objective-C對象以進行橋接的目的,我們可以退一步將值裝在類中。 除了在Objective-C中符合NSObject要求外,此類沒有任何公共接口,但是可以被Swift運行時識別,因此可以將其動態地轉換回盒裝類型。

長話短說。

要檢查value是否具有引用類型:

if type(of: value) is AnyClass {
    // ...
}

要檢查類型是否為引用類型:

if SomeType.self is AnyClass {
   // ...
}

更有用的答案:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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