为什么在设置时不需要解开可选的类型值?

时间:2018-10-26 09:38:52

标签: swift optional

这是否意味着set操作不会读取Optional的实际值,因此不需要将其解包?

var str = "Hello, playground"

class Base{
    var name:String?
};

var obj = Base()
obj.name = "hello" //this line don't need unwrapping first

2 个答案:

答案 0 :(得分:1)

当您set Optional属性时,不必解包。
仅在将可选值分配给非可选属性时才需要解包:

var name: String = "" // non-optional
var str: String?

// this will not compile, because you need to unwrap str first
name = str

// this will compile, because we're providing a default value
name = str ?? ""

// this will also compile, because name is not an optional
// it would still compile if name was optional, because str is optional too
str = name

答案 1 :(得分:1)

可选是一个框。该框可以不包含任何内容(称为nil),也可以包含特定类型的内容(在您的示例中为String)。您展开可选即可访问框中的值。

将值分配给可选时,只需将值分配给框本身。无需拆开任何东西,因为您只是在输入值。如果您分配nil,Swift要么清空该框,要么通过将其放入框中来包装该值。

解包是用于访问框中已经存在的值。


通过对其他答案的评论来回答您的问题...

  

但是为什么可选绑定不需要解包?我认为如果让constantName = some Optional也是一种赋值

可选绑定 解包操作和分配操作。它说:“如果框内有一个值,则将其分配给该新变量,然后输入then子句,否则,如果存在则进入else子句。”

var optionalValue: String? = "hello"

if let value = optionalValue {
    // value is the contents of the box, it has type String
    print("value is \(value)")
} else {
    // the optional binding failed because the box is empty
    print("optionalValue is nil")
}