【问题标题】:First program in Swift - HelloWorldSwift 中的第一个程序 - HelloWorld
【发布时间】:2016-02-14 22:16:29
【问题描述】:

我在 Swift 中的第一个代码有一些问题,当我运行它时,它看起来很好,但它显示了例如Hello 可选“(name)”而不是 Hello (name)。

import UIKit

class ViewController: UIViewController {


  @IBOutlet weak var helloLabel: UILabel!
  @IBOutlet weak var nameTextField: UITextField!
  @IBOutlet weak var sayHelloButton: UIButton!

  @IBAction func sayHelloAction(sender: AnyObject)

  {

    let name = nameTextField.text

    if name!.isEmpty {

        let alert = UIAlertController(title: "Error", message: "Please enter a name", preferredStyle: UIAlertControllerStyle.Alert)

        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    } else {

        helloLabel.text = "Hello \(name)!"
    }
  }
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    setupUI()
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

  func setupUI() {
    helloLabel.text = "Hello There!"
    helloLabel.textColor = UIColor.blueColor()
    helloLabel.textAlignment = NSTextAlignment.Center
    nameTextField.placeholder = "Enter your name"
    sayHelloButton.setTitle("Say Hello", forState: .Normal)

  }
}

有人可以帮帮我吗?

Doms。

【问题讨论】:

  • 我知道阅读文档并不酷,但至少阅读 Swift 语言指南的 The Basics 章节是值得的。
  • 您能否更新您的问题以包括您刚刚尝试过的内容以及新崩溃发生的位置?我还建议首先注释掉与警报相关的代码,然后只做一个print() 语句,以便更轻松地找出问题所在。
  • @vadian 谢谢,但我已经准备好了 :)

标签: ios xcode swift


【解决方案1】:

在 Swift 中,您有一个名为 Optional 的类型。这用于表示可空性。您需要执行所谓的解包选项。我会劝阻你不要强行解开 ! 这会导致你的应用程序崩溃。您可以使用 if let 语句解开可选值:

@IBAction func sayHelloAction(sender: AnyObject) {
    if let name = nameTextField.text where !name.isEmpty {
        helloLabel.text = "Hello \(name)"
    } else {
        let alert = UIAlertController(title: "Error", message: "Please enter a name", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

【讨论】:

  • 您好,在尝试您的解决方案后,xCode 显示“可选类型 'Bool' 不能用作布尔值”。有什么帮助吗?
  • 可选绑定有更有效的语法:if let name = nameTextField.text where !name.isEmpty {
【解决方案2】:

我自己在学习 Swift 时遇到了这个问题,而且它往往会出现在各种地方。例如,我不明白为什么我的 tableview 列之一总是说“0”而不是“1”或“2”。它实际上是在说“可选”!

最简单的解决方案是guard 无处不在。这样编译器就知道你已经检查过它不是 nil,并为你“解包”这个值。所以而不是:

let name = nameTextField.text

做一个:

guard let name = nameTextField.text else { return }

return 替换为更合适的内容。从那时起,name 就是字符串,不再有 Optional(theThingYouReallyWanted)

注意:正如我一开始所说,这有出现在奇怪地方的习惯。如果您将 Optionals 绑定到文本字段或表格列等内容中,您会在意想不到的时候看到它。我强烈建议为所有 UI 工作创建 getter/setter 属性,并使用上面的守卫来展开,而不是 return 交回一个空字符串或类似的东西。

【讨论】:

  • 嗨!在 let name 之前添加 'guard' 后,应用程序启动然后崩溃。带有 guard let name = nameTextField.text 的行以绿色突出显示,并显示 Thread:1 断点 1.1。有什么帮助吗?
【解决方案3】:

您会得到Optional(""),因为可选值未解包。您需要在对象之后放置一个!,您将不会再获得Optional("") 位。我会向您展示代码,但您没有向我们展示print() 语句。我在下面制作了一些示例,我认为它们会重现问题,尽管我还没有尝试过。

var value:String?
value = "Hello, World"

print("The Value Is \(value)") // Prints "The Value Is Optional(Hello, World)"    
print("The Value Is \(value!)")// Prints "The Value Is Hello, World"

【讨论】:

  • 没有。 OP 需要安全地解开,正如 Kyle 在 2 月的投票中所解释的那样。在这种情况下,您不应该使用强制展开,当然也不应该告诉初学者这就是他们所需要的。请阅读 Swift 手册。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
相关资源
最近更新 更多