如何在Swift 2中使用可选绑定

job*_*r80 5 optional uitextfield ios swift2 optional-binding

我是学习Swift的新手,所以我决定不再学习Swift 2.到目前为止,除了以下代码片段之外,一切对我都有意义.希望有人可以为我阐明这一点.

//: Playground - noun: a place where people can play
import UIKit

//Works
let possibleNumber="2"
if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
}
else {
    print("could not be converted to integer")
}

//Doesn't Work and I'm not sure why
let testTextField = UITextField()
testTextField.text = "2"
let numberString = testTextField.text  //I know this is redundant

if let num = Int(numberString) {
    print("The number is: \(num)")
}
else {
    print("Could not be converted to integer")
}
Run Code Online (Sandbox Code Playgroud)

代码的顶部部分直接来自Apple的Swift 2电子书,对我来说如何使用可选绑定将字符串转换为int是有意义的.第二段代码基本相同,只是字符串来自UITextField的text属性.代码的底部给出以下错误:

游乐场执行失败:/var/folders/nl/5dr8btl543j51jkqypj4252mpcnq11/T/./lldb/843/playground21.swift:18:18:错误:可选类型'String?'的值 没有打开; 你的意思是用'!' 要么 '?'?if let num = Int(numberString){

我通过使用这一行解决了这个问题:

if let num = Int(numberString!) {
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么第二个例子需要!而第一个没有.我确定问题与我从文本字段中获取字符串这一事实有关.谢谢!

Fog*_*ter 7

不同之处在于,第一种情况possibleNumber不是可选变量.这绝对是一个字符串.它不能是零.

在第二种情况下textField.text返回一个可选字符串,因此numberString是一个可选变量.它可能是零.

现在......转换Int("")返回一个可选的int.如果字符串是"abc",那么它不能返回一个数字,所以返回nil.这就是你在if let...声明中展开的内容.

但是,在第二种情况下,您的字符串也是可选的,Int()将不接受可选字符串.所以你强行打开它.这很危险,因为如果字符串为零,它可能会使应用程序崩溃.

你可以做的是......

if let numberString = textFeidl.text,
    number = Int(numberString) {
    // use the number
}
Run Code Online (Sandbox Code Playgroud)

这将首先解开文本,如果它可用,则使用它.得到号码.如果那不是零则输入块.

在Swift 2中,您也可以使用此guard let功能.

刚刚看到你正在使用Swift 2.

你也可以这样做......

func getNumber() -> Int {
    guard let numberString = textField.text,
          number = Int(numberString)
          else {
          return 0
    }

    return number
}
Run Code Online (Sandbox Code Playgroud)