[英]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 AnyObject
的false
返回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.