0

以下は私が遊び場に持っているコードです:

let aNumber : NSNumber? = nil

func testFuction() -> NSNumber!{
    return aNumber
}

dump(testFuction())

出力:

- nil

なぜクラッシュしないのか不思議です。戻り値NSNumber!は明らかに nil ですが、強制的にアンラップされています。これはクラッシュするべきではありませんか?説明してください。

4

3 に答える 3

2

暗黙的にアンラップされたオプションを返していますNSNumber!。返される基になるデータ型はオプションですが、使用するたびに自動的にラップ解除されます。Swift にはこの型が含まれているため、特定の時点以降は非 nil になることがわかっている変数の後に感嘆符を使用する必要はありません (たとえば、nil として開始されるが、使用される前に初期化されるインスタンス変数)。 . 暗黙的にアンラップされたオプションには nil 値を含めることができますが、実際に変数を使用しようとしたときに変数が nil の場合、使用時に強制的にアンラップされるため、実行時エラーが発生します。

于 2016-06-20T22:13:37.863 に答える
2

nil暗黙的にラップ解除するオプションは、ラップを解除するときにクラッシュし、オプションを渡してもラップが解除されdumpません。(暗黙的にラップされた) オプションの値 (T!) をアンラップされた型 (T) の値として渡すと、暗黙的なアンラップが発生しますが、関数がオプションを受け入れる場合、アンラップは発生しません。

のようなことを行うことで暗黙的なアンラップを行うことができますがlet unwrapped: NSNumber = testFunction()、これはクラッシュします。

値を強制的にアンラップするつもりなら、感嘆符は戻り値の型の後ではなく、値の後に置きます。

func testFuction() -> NSNumber {
    return aNumber!
}
于 2016-06-20T22:09:33.390 に答える
1

あなたの関数は、暗黙的にアンラップされたオプションを返します。として使用しようとすると、暗黙的にアンラップされますNSNumberが、それでもオプションであるため、正当にnil値を持つことができます。

感嘆符を後に置いてaNumber、関数の戻り値の型から削除すると、予想どおりクラッシュが発生します。

func testFuction() -> NSNumber {
    return aNumber!
}
于 2016-06-20T22:09:33.187 に答える