将文本字段值分配给 Swift 中的变量
Assigning text field value to variable in Swift
我正在努力学习 Swift,结果发现它与其他语言的差异超出了我的预期...
我只想将用户输入的值作为整数存储在变量中。
我的尝试导致以下错误:
"fatal error: unexpectedly found nil while unwrapping an Optional value"
我已经尝试了多种方法,但似乎无法提出解决方案,我知道必须有一个简单的方法来做到这一点。
var intNumber: Int = 0
@IBOutlet weak var txt_Number: UITextField!
for view in self.view.subviews as [UIView]{
if let txt = view as? UITextField
{
if let txtData = txt.text where txtData.isEmpty
{
// Error Message
}
else
{
intNumber = Int(txt_Number.text)
}
}
}
我知道上面的代码不正确,但我认为这是最接近正确的代码。就展开而言,我似乎遗漏了一些东西。我了解解包的原理,但我尝试过的任何东西都无法编译,或者如果它确实编译然后在启动代码时失败并出现上述错误(按下按钮时启动代码)。
在此先感谢您的帮助!
你试过这个吗?
if let txtData = txt.text where !txtData.isEmpty
{
intNumber = Int(txtData)
}
else
{
// Error Message
}
添加:
Int()
函数 returns 和 Optional
。如果你确定这个值是正确的,你可以通过在变量名的末尾使用!
强制解包(当你使用它时),否则就把问号?
几个想法:
确保您的插座连接到 txt_Number
。如果 (a) 它是您在 IB 中连接的出口,则不需要所有代码检查以确保它不是 nil
;和 (b) 在视图完全加载之前你没有执行上面的代码(即 viewDidLoad
被调用)。
如果插座没有连接,您会在左边看到一个空点:
如果连接正确,您会在左边距看到一个实心点:
如果一切都正确连接,你可以这样做:
guard let txtData = txt_Number.text, let value = Int(txtData) else {
// report error and then `return`
return
}
intNumber = value
如果你想花哨一些,你可能希望通过
确保用户只输入数值
在 viewDidLoad
中指定键盘仅用于十进制数字。
txt_Number.keyboardType = .NumberPad
或者您也可以在 IB 中指定。
为文本字段指定一个委托人,只允许他们输入数值。 (根据前面的观点,这似乎是多余的,但事实并非如此,因为您还必须预料到它们会将字符串粘贴到文本字段中。)
参见 。
对于初学者,如果您有直接参考 txt_Number
,则不必遍历 subviews
,但这不是您问题的本质。
if let
语义会让你解开 {}
括号内的任何可选,所以这里最明显的解决方案是:
if let unwrappedString = txt_Number.text {
if let unwrappedIntegerInit = Int(unwrappedString) {
intNumber = unwrappedIntegerInit
}
}
我在操场上的完整示例:
var intNumber: Int = 0
var txt_Number: UITextField = UITextField()
txt_Number.text = "12"
if let unwrappedString = txt_Number.text {
if let unwrappedIntegerInit = Int(unwrappedString) {
intNumber = unwrappedIntegerInit
}
}
print(intNumber)
或者你可以在函数内部使用 guard:
func parse() {
guard let text = txt_Number.text, let number = Int(text) else { return } // no text
intNumber = number
}
提示:
您必须分别解包 txt_Number.text
和 Int(text)
,因为 Int(text)
必须有非可选参数。
尝试使用下面的代码将 TextField 的值赋给 float 类型的变量,所有错误都神奇地消失了
@IBOutlet weak var txtamount: UITextField!
@IBOutlet weak var txtrate: UITextField!
@IBOutlet weak var txtyear: UITextField!
@IBOutlet weak var lblresult: UILabel!
@IBAction func btncalculate(_ sender: UIButton)
{
print("button is clicked")
var amount,rate,year,answer : Float
amount = Float(txtamount.text!)!
rate = Float(txtrate.text!)!
year = Float(txtyear.text!)!
answer = (amount * rate * year) / 100.0
}
我正在努力学习 Swift,结果发现它与其他语言的差异超出了我的预期...
我只想将用户输入的值作为整数存储在变量中。
我的尝试导致以下错误: "fatal error: unexpectedly found nil while unwrapping an Optional value"
我已经尝试了多种方法,但似乎无法提出解决方案,我知道必须有一个简单的方法来做到这一点。
var intNumber: Int = 0
@IBOutlet weak var txt_Number: UITextField!
for view in self.view.subviews as [UIView]{
if let txt = view as? UITextField
{
if let txtData = txt.text where txtData.isEmpty
{
// Error Message
}
else
{
intNumber = Int(txt_Number.text)
}
}
}
我知道上面的代码不正确,但我认为这是最接近正确的代码。就展开而言,我似乎遗漏了一些东西。我了解解包的原理,但我尝试过的任何东西都无法编译,或者如果它确实编译然后在启动代码时失败并出现上述错误(按下按钮时启动代码)。
在此先感谢您的帮助!
你试过这个吗?
if let txtData = txt.text where !txtData.isEmpty
{
intNumber = Int(txtData)
}
else
{
// Error Message
}
添加:
Int()
函数 returns 和 Optional
。如果你确定这个值是正确的,你可以通过在变量名的末尾使用!
强制解包(当你使用它时),否则就把问号?
几个想法:
确保您的插座连接到
txt_Number
。如果 (a) 它是您在 IB 中连接的出口,则不需要所有代码检查以确保它不是nil
;和 (b) 在视图完全加载之前你没有执行上面的代码(即viewDidLoad
被调用)。如果插座没有连接,您会在左边看到一个空点:
如果连接正确,您会在左边距看到一个实心点:
如果一切都正确连接,你可以这样做:
guard let txtData = txt_Number.text, let value = Int(txtData) else { // report error and then `return` return } intNumber = value
如果你想花哨一些,你可能希望通过
确保用户只输入数值在
viewDidLoad
中指定键盘仅用于十进制数字。txt_Number.keyboardType = .NumberPad
或者您也可以在 IB 中指定。
为文本字段指定一个委托人,只允许他们输入数值。 (根据前面的观点,这似乎是多余的,但事实并非如此,因为您还必须预料到它们会将字符串粘贴到文本字段中。)
参见 。
对于初学者,如果您有直接参考 txt_Number
,则不必遍历 subviews
,但这不是您问题的本质。
if let
语义会让你解开 {}
括号内的任何可选,所以这里最明显的解决方案是:
if let unwrappedString = txt_Number.text {
if let unwrappedIntegerInit = Int(unwrappedString) {
intNumber = unwrappedIntegerInit
}
}
我在操场上的完整示例:
var intNumber: Int = 0
var txt_Number: UITextField = UITextField()
txt_Number.text = "12"
if let unwrappedString = txt_Number.text {
if let unwrappedIntegerInit = Int(unwrappedString) {
intNumber = unwrappedIntegerInit
}
}
print(intNumber)
或者你可以在函数内部使用 guard:
func parse() {
guard let text = txt_Number.text, let number = Int(text) else { return } // no text
intNumber = number
}
提示:
您必须分别解包 txt_Number.text
和 Int(text)
,因为 Int(text)
必须有非可选参数。
尝试使用下面的代码将 TextField 的值赋给 float 类型的变量,所有错误都神奇地消失了
@IBOutlet weak var txtamount: UITextField!
@IBOutlet weak var txtrate: UITextField!
@IBOutlet weak var txtyear: UITextField!
@IBOutlet weak var lblresult: UILabel!
@IBAction func btncalculate(_ sender: UIButton)
{
print("button is clicked")
var amount,rate,year,answer : Float
amount = Float(txtamount.text!)!
rate = Float(txtrate.text!)!
year = Float(txtyear.text!)!
answer = (amount * rate * year) / 100.0
}