将字符串设置为可选值的问题
Issues setting string to optional value
如何将按钮内的标签传递给下一个activity,
这是我的代码,但它不起作用
@IBOutlet weak var elecB: UIButton!
我的 prepareForSegue 代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var result:searchResultView = segue.destinationViewController as! searchResultView
if elecB.selected{
result.cat = elecB.titleLabel?.text!
}
}
它告诉我这行代码有错误
result.cat = elecB.titleLabel?.text!
cat 是一个字符串
任何人都可以帮助我,我只想将单击的按钮内的标签传递给下一个视图控制器
将 titleLabel
的声明更改为 titleLabel: UILabel!
或 titleLabel: UILabel
,因为您实际上不需要它是可选的。听起来您有理由期望该标签一直存在。
使 cat
可选也不是最好的解决方案,因为您希望该字符串始终具有值。因此,保持 cat
不变,并使您的标题标签 non-optional,或者如果 Xcode 抱怨,则隐式展开(!
)。
?
和 !
是什么意思?
声明后的 ?
表示该变量是 可选的 ,并且可以合理地排除为 nil
(这也允许您设置它到 nil
)。每次要使用它时,您还必须在变量名后跟一个 ?
,或者将它包装在一个 if let a = myOptionalVar {...}
中,这样代码 只会在变量不存在时执行nil
.
声明后的 !
使其成为 implicitly-unwrapped 可选 。这意味着变量 可以是 nil
,但在大多数情况下 假设 不是 nil
,所以你不必在每次要使用它时都在后面加上 !
。但是请注意,如果当您尝试使用该变量时恰好为 nil,您的程序将崩溃。
!
只应在绝对必要时使用,因为它本质上是不安全的。例如,如果 Interface Builder 要求 @IBOutlet
变量是可选的,那么最好将它们设置为 !
,因为它们会在您的 class 从故事板创建时自动初始化,并将在剩下的时间里都有价值。
两者都不使用意味着该变量不是可选的,即它必须始终有一个值,并且不能是nil
.
查看 Swift 文档以了解可选变量的定义(声明末尾带有 ? 的变量。
如果您定义这样的变量 var cat:String?
那么该变量是可选的。这实质上意味着变量可以有 nil 作为值。
来自 Apple 的文档:
在值可能不存在的情况下使用可选值。一个可选的说:
- 有一个值,它等于 x
要么
- 根本没有价值
下面的示例使用 toInt() 方法尝试将 String 转换为 Int:
let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()
// convertedNumber is inferred to be of type "Int?", or "optional Int"
因为 toInt() 方法可能会失败,所以它 returns 是一个可选的 Int,而不是一个 Int。一个可选的 Int 写成 Int?,而不是 Int。问号表示它包含的值是可选的,这意味着它可能包含一些 Int 值,或者它可能根本不包含任何值。 (它不能包含任何其他内容,例如 Bool 值或 String 值。它要么是 Int,要么什么都不是。)
如何将按钮内的标签传递给下一个activity,
这是我的代码,但它不起作用
@IBOutlet weak var elecB: UIButton!
我的 prepareForSegue 代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var result:searchResultView = segue.destinationViewController as! searchResultView
if elecB.selected{
result.cat = elecB.titleLabel?.text!
}
}
它告诉我这行代码有错误
result.cat = elecB.titleLabel?.text!
cat 是一个字符串
任何人都可以帮助我,我只想将单击的按钮内的标签传递给下一个视图控制器
将 titleLabel
的声明更改为 titleLabel: UILabel!
或 titleLabel: UILabel
,因为您实际上不需要它是可选的。听起来您有理由期望该标签一直存在。
使 cat
可选也不是最好的解决方案,因为您希望该字符串始终具有值。因此,保持 cat
不变,并使您的标题标签 non-optional,或者如果 Xcode 抱怨,则隐式展开(!
)。
?
和 !
是什么意思?
声明后的 ?
表示该变量是 可选的 ,并且可以合理地排除为 nil
(这也允许您设置它到 nil
)。每次要使用它时,您还必须在变量名后跟一个 ?
,或者将它包装在一个 if let a = myOptionalVar {...}
中,这样代码 只会在变量不存在时执行nil
.
声明后的 !
使其成为 implicitly-unwrapped 可选 。这意味着变量 可以是 nil
,但在大多数情况下 假设 不是 nil
,所以你不必在每次要使用它时都在后面加上 !
。但是请注意,如果当您尝试使用该变量时恰好为 nil,您的程序将崩溃。
!
只应在绝对必要时使用,因为它本质上是不安全的。例如,如果 Interface Builder 要求 @IBOutlet
变量是可选的,那么最好将它们设置为 !
,因为它们会在您的 class 从故事板创建时自动初始化,并将在剩下的时间里都有价值。
两者都不使用意味着该变量不是可选的,即它必须始终有一个值,并且不能是nil
.
查看 Swift 文档以了解可选变量的定义(声明末尾带有 ? 的变量。
如果您定义这样的变量 var cat:String?
那么该变量是可选的。这实质上意味着变量可以有 nil 作为值。
来自 Apple 的文档: 在值可能不存在的情况下使用可选值。一个可选的说: - 有一个值,它等于 x 要么 - 根本没有价值
下面的示例使用 toInt() 方法尝试将 String 转换为 Int:
let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()
// convertedNumber is inferred to be of type "Int?", or "optional Int"
因为 toInt() 方法可能会失败,所以它 returns 是一个可选的 Int,而不是一个 Int。一个可选的 Int 写成 Int?,而不是 Int。问号表示它包含的值是可选的,这意味着它可能包含一些 Int 值,或者它可能根本不包含任何值。 (它不能包含任何其他内容,例如 Bool 值或 String 值。它要么是 Int,要么什么都不是。)