1

私はこれに矮小化されたものを扱っています:

func isAnyObject<T>(someObject: T) {
    if let object = someObject as? AnyObject {
        // do something
    } else {
        // do something else
    }
}

これにより、コンパイラの警告が表示されます。

  1. 「T」から「AnyObject」への条件付きキャストは常に成功する
  2. オプションのチェックで使用されるタイプ 'AnyObject' のオプションではない式

キャストが常に成功する理由は理解できますが、それを修正するために何をすればよいかわかりません。2行目をに変更しようとしまし if let object = foo as AnyObject? たが、構造体を関数に渡すと、まだ「if」ブロックに入ります。ここで何が欠けていますか?

4

2 に答える 2

0

変数の型が AnyObject かどうかを確認できます。もしそうなら、それは参照型です。値型でない場合。遊び場でも警告が出ますが、警告が間違っています。以下のコードはfalse、false、false、false、trueを生成するため、明らかに関数が機能し、警告が示すようにテストが常にtrueになるとは限りません. これはバグです。

    func isReferenceType<T>(someObject: T) -> Bool {
        return type(of: someObject) is AnyObject
    }

    //Values
    print(isReferenceType(someObject: "a"))
    print(isReferenceType(someObject: 1))
    print(isReferenceType(someObject: Int?(0)))
    print(isReferenceType(someObject: {print("1")}))
    //Reference
    print(isReferenceType(someObject: UIView()))
于 2016-10-28T23:10:10.423 に答える