编辑:我想出了如何防止这种情况,但我仍然有一个问题,为什么它返回一个可选值。你可以跳到最后。
我对Swift很新,而且我得到了我无法理解的行为。假设我将一个名为myButton
的弹出按钮拖到ViewController中。我想将当前选定的项目打印到控制台。我就是这样做的:
@IBOutlet weak var myButton: NSPopUpButton!
override func viewDidLoad() {
super.viewDidLoad()
let myVariable = myButton.titleOfSelectedItem
print(myVariable)
// Do any additional setup after loading the view.
}
我希望打印Item1
,因为这是加载视图时默认选择的选项。但是,我实际上得到Optional("Item 1")
。
这给我带来了一些问题。例如,print(myVariable)
行给了我这个神秘的错误:
表达式是否明确强制来自'String?'任何
另外,我做不到这样的事情:
if myButton.titleOfSelectedItem == "Item1" || "Item3" {
let currentSelection = "odd"
} else {
let currentSelection = "even"
}
因为我得到了一堆错误 - 因为||
和else
据我所知,即使我认为它应该可以正常工作。
我试过搜索发生这种情况的原因,但找不到任何解释。从警告中可以看出,当我使用titleOfSelectedItem
进行选择时,它会为我提供可选值。这没有意义,因为要选择菜单项 。其值不能为nil
。
我查了一堆教程,看看它们是如何实现弹出按钮功能的。我唯一能看到的就是有人
func removeAllItems()
func addItems(withTitles: [String])
var indexOfSelectedItem: Int
和然后使用它。然而,这似乎不必要地复杂化,我无法理解为什么我不能仅使用myButton.titleOfSelectedItem
获得所选弹出项目的标题。谁能建议我做什么?
修改
所以我意识到你需要“解包”可选值以使其成为正常值,这就像在变量末尾添加!
一样简单,如下所示:
@IBOutlet weak var myButton: NSPopUpButton!
override func viewDidLoad() {
super.viewDidLoad()
let myVariable = myButton.titleOfSelectedItem!
print(myVariable)
// Do any additional setup after loading the view.
}
现在没有错误,并且打印了Item1
。
我还不能理解的是,为什么首先打印一个可选值? NSPopUpButton中有三个项目。三个中的任何一个都有被选中。 myButton.titleOfSelectedButton
没有机会成为nil
。为什么我需要打开它以将其用作myButton.titleOfSelectedButton!
的字符串,如果它不是可选的?
答案 0 :(得分:1)
titleOfSelectedItem
返回一个可选项,因为无法选择任何项目。
你需要可选的绑定来安全地打开选项,你必须对标题字符串评估“Item1”和“Item3”:
if let title = myButton.titleOfSelectedItem {
print(title)
let currentSelection : String
if title == "Item1" || title == "Item3" {
currentSelection = "odd"
} else {
currentSelection = "even"
}
}