2017-05-29 4 views
7

は私がkotlinで「+キャストせた場合」の組み合わせを達成する方法を見つけようとしている「場合は聞かせて+はキャスト」:迅速でKotlin - のスウィフトの組み合わせに等価

if let user = getUser() as? User { 
    // user is not nil and is an instance of User 
} 

私はいくつかのドキュメントを見ましたが、彼らは、この組み合わせは、使用することができますKotlinで

https://medium.com/@adinugroho/unwrapping-sort-of-optional-variable-in-kotlin-9bfb640dc709 https://kotlinlang.org/docs/reference/null-safety.html

答えて

11

1つのオプションは、+ letsafe cast operator + safe callを使用することです:letに渡された

(getUser() as? User)?.let { user -> 
    ... 
} 

別のラムダの内側smart castを使用することです:

getUser().let { user -> 
    if (user is User) { 
     ... 
    } 
} 

しかし、おそらく最も読みやすいでしょう変数を導入し、そこでスマートキャストを使用するだけです。

val user = getUser() 
if (user is User) { 
    ... 
} 
+1

私はあなたの最初の例で "elvis operator"( '?:')ではなく、 "安全な呼び出し"( '?。')を使用していると思います。 – mhoff

+0

@MichaelHoffありがとう、固定 –

+0

明らかに、もしスウィフトが天才だったならば、これらの選択肢は貧弱で、より貧弱です。 – Rob

0

について何も言いません。

(getUser() as? User)?.let { user -> 
    // user is not null and is an instance of User 
} 

as?が失敗した場合にエラーをスローするのではなくnullを返し'safe' cast operatorあります。

1

Kotlinは、特別な構文を必要としない通常のif文に基づいて、現在のスコープ内で値がnilであるかどうかを自動的に判別できます。

val user = getUser() 

if (user != null) { 
    // user is known to the compiler here to be non-null 
} 

それは周りにあまりにも

val user = getUser() 

if (user == null) { 
    return 
} 

// in this scope, the compiler knows that user is not-null 
// so there's no need for any extra checks 
user.something 
2

KotlinであなたはLETを使用することができ、他の方法で動作します:

val user = getUser()?.let { it as? User } ?: return 

このソリューションは、Guardに最も近いですが、それは有用であるかもしれないが。

0

この場合はどうなりますか?

val user = getUser() ?: return