2016-09-17 10 views
3

Swift 3では、汎用変数型がクラス(AnyObject)であるかどうかをチェックできなくなりました。次のコードは、特定のタイプTおよび渡された値が構造体でありクラスではなくても、isObjecttrueを返します。 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 

スウィフト3で正しく動作させるにはどうすればよいですか?スウィフト3では

+0

でも '90 is AnyObject'は' true'を返します。私のバグのように聞こえる。 – MirekE

+1

関連:[AnyObjectはXcode8 beta6で動作していませんか?](http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6) – Hamish

答えて

7

、すべてが不透明なのObjective-C互換ボックスでのObjective-Cに直接架橋可能ではない何かを包むことができる、(詳細はthis Q&Aを参照)による_SwiftValueの導入にAnyObjectに架橋可能です。

したがってis AnyObjectは、_SwiftValueでラッピングしてAnyObjectと表現できます。

値が基準型であるかどうかをチェックする1つの方法は(this Q&Aに示すように)AnyObjectのメタタイプに対して値の入力、確認型である、AnyClass(別名AnyObject.Type)。あなたがTの静的な型が参照型であるかどうかを確認したい場合は、あなたが行うことができますジェネリック医薬品については

、:

isObject = T.self is AnyClass 

あなたのように入力した値の動的型かどうかを確認したい場合

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

    // ... 
} 
Tが参照型である(例えば、あなたの例では valのように)、あなたは& Aが示唆前述のQとして、開封された値に type(of:)機能を使用することができます

TAny(または非抽象タイプAnyObject)の場合、T.self is AnyClassfalseを返します(値が参照または値タイプのボックスを使用する場合に便利です) - type(of: val) is AnyClassしかし、val自体が参照型かどうかを返します。

関連する問題