swift 可选值只需要解包一次就可以多次使用而无需再次解包是真的吗?
is it true that swift optional values only needs to be unwrapped once and then it can be used multiple times without unwrapping it again?
我是 Swift 的新手,正在尝试构建计算器的初学者项目。我知道 "display.text" returns 一个可选字符串,其中的字符串值必须用“!”展开才可以使用。
不过,我注意到"display.text"只需要解包一次就可以多次使用而无需再次解包。 Swift 可选值是否如此?我在哪里可以找到有关此事的一些指导方针?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var display: UILabel!
var userIsInTheMiddleOfTypingANumber = false
@IBAction func appendDigit(sender: UIButton) {
let digit = sender.currentTitle!
if userIsInTheMiddleOfTypingANumber {
display.text = display.text! + digit
} else {
display.text = digit
userIsInTheMiddleOfTypingANumber = true
}
}
试试这个。
guard let displayText = display.text else {
// handle the case when optional has nil value
}
// In this scope you can use non-nil value of display.text as displayText.
print("displayText = \(displayText)")
这就是展开一次后使用可选值的方法。另一种更简单的方法是只使用而不是 guard-let
.
if let displayText = display.text else {
// safely unwrapped
}
希望对您有所帮助!
查看此 link 以获得更多帮助。
两个标准选项用于解包可选的,以便再次使用:
1) 如果让
if let unwrappedValue = someOptional {
// unwrappedValue can be used only inside this block of code
}
2) 后卫
guard let unwrappedValue = someOptional else { return }
/// unwrappedValue can be used as long as it is in scope
你通常应该避免强制展开可选值(使用运算符 !
),因为如果可选值包含 nil
,这将产生运行时异常。下面是一些处理可选项展开的技术。
可选绑定
请注意,如果您 unwrap 并 assign ,那么您可以 "unwrap it once and then use it multiple times" 的唯一方法同一固有类型的另一个非可选变量.
这是使用optional binding时所做的:
/* Example setup */
let display: UILabel = UILabel()
let digit = "1"
/* optional binding using if-let:
_assign_ unwrapped value (if non-nil) to 'unwrapped' */
if let unwrappedText = display.text {
// 'unwrapped' resides in scope inside of the if-let block
display.text = unwrappedText + digit
}
else {
display.text = digit
}
/* optional binding using guard-let-else:
_assign_ unwrapped value (if non-nil) to 'unwrapped' */
func foo(disp: UILabel, _ dig: String) {
guard let unwrappedText = display.text else {
display.text = digit
return
}
// 'unwrapped' resides in scope outside of the guard-let-else block
display.text = unwrappedText + digit
}
foo(display, digit)
无合并运算符
如果您不想使用条件绑定显式分配展开的值,您可以使用 nil coalescing operator 进行安全展开。
/* nil coalescing operator */
display.text = (display.text ?? "") + digit
但是,现在您可以以半可选绑定的方式使用 nil 合并运算符;如果可选为 nil,则分配可选或某些默认值的展开值:
let metaUnwrapped = display.text ?? ""
不可变 metaUnwrapped
将在其范围内可用,并包含 display.text
的值(在赋值时),如果非 nil
,或默认值 ""
,如果 display.text
在赋值时是 nil
。您可以在上面的可选绑定示例中以与不可变 unwrapped
相同的方式使用 metaUnwrapped
:
display.text = metaUnwrapped + digit
可选链接
这有点离谱 w.r.t。你的问题,但由于我们讨论的是可选项和展开的主题,我不妨提一下 optional chaining.
可选链接可用于访问某些可选 属性 的属性,前提是可选 属性 不是 nil
。例如,假设您要计算 display.text
中的字符数,但自然只有当可选的 .text
属性 是非 nil
时。在这种情况下,可选链接与 nil 合并运算符相结合可能是一种合适的选择方法:
let numCharacters = display.text?.characters.count ?? 0
/* if text != nil, returns character count; otherwise, by
nil coalescing operator, returns 0 /*
我是 Swift 的新手,正在尝试构建计算器的初学者项目。我知道 "display.text" returns 一个可选字符串,其中的字符串值必须用“!”展开才可以使用。
不过,我注意到"display.text"只需要解包一次就可以多次使用而无需再次解包。 Swift 可选值是否如此?我在哪里可以找到有关此事的一些指导方针?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var display: UILabel!
var userIsInTheMiddleOfTypingANumber = false
@IBAction func appendDigit(sender: UIButton) {
let digit = sender.currentTitle!
if userIsInTheMiddleOfTypingANumber {
display.text = display.text! + digit
} else {
display.text = digit
userIsInTheMiddleOfTypingANumber = true
}
}
试试这个。
guard let displayText = display.text else {
// handle the case when optional has nil value
}
// In this scope you can use non-nil value of display.text as displayText.
print("displayText = \(displayText)")
这就是展开一次后使用可选值的方法。另一种更简单的方法是只使用而不是 guard-let
.
if let displayText = display.text else {
// safely unwrapped
}
希望对您有所帮助!
查看此 link 以获得更多帮助。
两个标准选项用于解包可选的,以便再次使用:
1) 如果让
if let unwrappedValue = someOptional {
// unwrappedValue can be used only inside this block of code
}
2) 后卫
guard let unwrappedValue = someOptional else { return }
/// unwrappedValue can be used as long as it is in scope
你通常应该避免强制展开可选值(使用运算符 !
),因为如果可选值包含 nil
,这将产生运行时异常。下面是一些处理可选项展开的技术。
可选绑定
请注意,如果您 unwrap 并 assign ,那么您可以 "unwrap it once and then use it multiple times" 的唯一方法同一固有类型的另一个非可选变量.
这是使用optional binding时所做的:
/* Example setup */
let display: UILabel = UILabel()
let digit = "1"
/* optional binding using if-let:
_assign_ unwrapped value (if non-nil) to 'unwrapped' */
if let unwrappedText = display.text {
// 'unwrapped' resides in scope inside of the if-let block
display.text = unwrappedText + digit
}
else {
display.text = digit
}
/* optional binding using guard-let-else:
_assign_ unwrapped value (if non-nil) to 'unwrapped' */
func foo(disp: UILabel, _ dig: String) {
guard let unwrappedText = display.text else {
display.text = digit
return
}
// 'unwrapped' resides in scope outside of the guard-let-else block
display.text = unwrappedText + digit
}
foo(display, digit)
无合并运算符
如果您不想使用条件绑定显式分配展开的值,您可以使用 nil coalescing operator 进行安全展开。
/* nil coalescing operator */
display.text = (display.text ?? "") + digit
但是,现在您可以以半可选绑定的方式使用 nil 合并运算符;如果可选为 nil,则分配可选或某些默认值的展开值:
let metaUnwrapped = display.text ?? ""
不可变 metaUnwrapped
将在其范围内可用,并包含 display.text
的值(在赋值时),如果非 nil
,或默认值 ""
,如果 display.text
在赋值时是 nil
。您可以在上面的可选绑定示例中以与不可变 unwrapped
相同的方式使用 metaUnwrapped
:
display.text = metaUnwrapped + digit
可选链接
这有点离谱 w.r.t。你的问题,但由于我们讨论的是可选项和展开的主题,我不妨提一下 optional chaining.
可选链接可用于访问某些可选 属性 的属性,前提是可选 属性 不是 nil
。例如,假设您要计算 display.text
中的字符数,但自然只有当可选的 .text
属性 是非 nil
时。在这种情况下,可选链接与 nil 合并运算符相结合可能是一种合适的选择方法:
let numCharacters = display.text?.characters.count ?? 0
/* if text != nil, returns character count; otherwise, by
nil coalescing operator, returns 0 /*