2016-09-17 112 views
3

在Swift 3中,我不再能夠檢查泛型變量類型是否爲類(AnyObject)。以下代碼返回trueisObject即使特定類型T和傳遞的值是結構,而不是類。在Swift 2.3和2.2中,它按預期工作,isObjectfalse如何測試泛型變量是否爲AnyObject類型

struct Foo<T> 
{ 
    var value: Any? 
    var isObject: Bool = false 

    init (val: T?) 
    { 
     if val != nil 
     { 
      // following line shows warnings in Swift 3 
      // conditional cast from 'T?' to 'AnyObject' always succeeds 
      // 'is' cast is always true 
      isObject = val is AnyObject 

      self.value = val 
     } 
    } 
} 

struct Bar 
{ 
    var bar = 0 
} 

let b = Foo<Bar>(val: Bar()) 

print(b.isObject) // -> true 

我怎樣才能使它在Swift 3中正常工作?

+0

即使'90是AnyObject'返回'true'。聽起來像是一個bug。 – MirekE

+1

相關:[AnyObject不工作在Xcode8 beta6?](http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6) – Hamish

回答

7

在斯威夫特3,一切都是橋接至AnyObject由於引進的_SwiftValue(見this Q&A獲取更多信息),它可以包含任何不是直接橋接來的Objective-C在一個不透明的Objective-C的兼容框。

因此is AnyObject將始終爲真,因爲任何東西都可以通過包裝在_SwiftValue中表示爲AnyObject

一種方法來檢查一個值是否是一個引用類型(如圖this Q&A)是鍵入檢查的值的類型針對AnyObjectAnyClass(又名AnyObject.Type)的元類型。

仿製藥,如果你想查看靜態類型的T是否是引用類型,你可以這樣做:

isObject = T.self is AnyClass 

如果你想檢查一個值的動態類型是否類型爲T是引用類型(如在你的例子val)時,可以使用type(of:)功能上展開的值,作爲所述的Q &甲表明:

if let val = val { 
    isObject = type(of: val) is AnyClass 

    // ... 
} 

這兩種方法之間的區別是,當TAny型(或非AnyObject抽象型),T.self is AnyClass將返回false(如果你想有一個對話框,在其中的價值可能是一個引用或值類型可能是有用的) - type(of: val) is AnyClass但是,將返回val本身是否是引用類型。