4

正しく行う方法などの答えを探しているのではなく、なぜこれが起こるのか.

コードは次のとおりです。

func isInt(param: AnyObject?) {
    if let value = param as? Int {
        print(value)
    } else {
        print("Not Int")
    }

    if let value = param {
        if value is Int {
            print(value)
        } else {
            print("Not Int")
        }
    }
}

let a:AnyObject? = 1.2
let b:Float? = 1.2
let c:Double? = 1.2

isInt(a)
isInt(b)
isInt(c)

if最初のループで、paramが にキャストされてからInt出力されることを理解してい1ます。

しかし、なぜ 2 番目のifループでif value is Inttrue を出力して出力するの1.2でしょうか。

4

3 に答える 3

3

あなたのb場合、タイプにlet value = paramブリッジvalueしますNSNumber。についてNSNumberは、value is Int常に true になります。

ブリッジされていない値の場合:

a is Int // always true, AnyObject bridges to NSNumber here
b is Int // false, cast from Float to Int always fails
c is Int // false, cast from Double to Int always fails

この回答は、Foundation がインポートされていることを前提としています。Foundation がなければ、割り当ては失敗します。

于 2016-01-27T21:05:33.840 に答える
1

さて、次のようにすればそれのようです:

func isInt(param: AnyObject?) {

    if let value = param {
        if value is Double {
            print("I'm a double")
        }
    if value is Int{
            print("I'm an int")
        }else {
            print("Not Int")
        }
    }
}

3つすべてに対して「I'm a double」と、3つすべてに対して「I'm an int」も出力されます。if ステートメントに行くと、値を NSNumber にブリッジするようです。これは、どの NSNumber タイプにも当てはまります。

ただし、次のことを行うとします。

if let value = param {
        if value is String {
            print("I'm a String")
        } 
        if value is Int{
            print("I'm an int")
        }else {
            print("Not Int")
        }
    }
}

String は NSNumber 型ではないため、値が NSNumber 型の Int の場合はスキップして値を返します。

于 2016-01-27T21:05:31.623 に答える