2017-04-07 21 views
4

我怎樣才能避免使用!!類的可選屬性科特林空安全的類屬性

class PostDetailsActivity { 

    private var post: Post? = null 

    fun test() { 
     if (post != null) { 
      postDetailsTitle.text = post.title // Error I have to still force using post!!.title 
      postDetailsTitle.author = post.author 

      Glide.with(this).load(post.featuredImage).into(postDetailsImage) 

     } else { 
      postDetailsTitle.text = "No title" 
      postDetailsTitle.author = "Unknown author" 

      Toast.makeText(this, resources.getText(R.string.post_error), Toast.LENGTH_LONG).show() 
     } 
    } 
} 

我應該創建一個局部變量?我想用!!是不是一個好的做法

+3

Android的工作室爲您提供了理由_「‘後’是可能已經被改變了可變特性這次」_。根據你打算如何使用'title',一種可能的選擇是'post?.apply {title}' – Michael

+0

如果我需要像'else'這樣的替代條件,該怎麼辦? –

+0

您能否發表您想要達到的完整示例? –

回答

5

您可以使用適用於:

fun test() { 
    post.apply { 
     if (this != null) { 
      postDetailsTitle.text = title 
     } else { 
      postDetailsTitle.text = "No title" 
     } 
    } 
} 

或:

fun test() { 
    with(post) { 
     if (this != null) { 
      postDetailsTitle.text = title 
     } else { 
      postDetailsTitle.text = "No title" 
     } 
    } 
} 
+0

這似乎是單一財產最直接的解決方案。 'let'也可以使用。另請參閱[這裏](https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/13?u=mfulton26)多個屬性。 – mfulton26

3

此:

if (post != null) { 
    postDetailsTitle.text = post.title // Error I have to still force using post!!.title 
} else { 
    postDetailsTitle.text = "No title" 
} 

可以替換爲:

postDetailsTitle.text = post?.title ?: "No title" 

如果表達式的左側:不爲空,則elvis運算符返回它,否則返回右邊的表達式。

+0

我簡化了一點點所有的代碼我有一些其他的屬性 –

+0

那麼,它仍然是每個屬性的一行。 'postDetailsTitle.propertyX =交.propertyX:??defaultX' – Michael

+0

我不想複製完整的類,我添加了幾行 –