在Swift中混合使用数组,元组和闭包的问题

时间:2015-05-27 15:07:26

标签: arrays swift closures tuples

我正在尝试管理(String,闭包)元组的数组。

数组定义为:

var menuItems: [(title: String, closure: () -> Void)] = []

现在我正在尝试添加项目:

// 1. Adding directly a tuple fails with "Missing argument for parameter 'closure' in call"
menuItems.append((title: "any", closure: {}))

// 2. Using let works
let item: (title: String, closure: () -> Void) = (title: "any", closure: {})
menuItems.append(item)

// 3. Using var fails with "Missing argument for parameter 'closure' in call"
var item: (title: String, closure: () -> Void) = (title: "any", closure: {})
menuItems.append(item)

任何解释或更好的方式来添加项目将不胜感激。

3 个答案:

答案 0 :(得分:2)

我怀疑它是关于元组类型的模糊性。如果您定义typealias问题就会消失:

typealias MenuItem = (title: String, closure: () -> Void)
var menuItems: [MenuItem] = []
var item: MenuItem = (title: "any", closure: {})
let item2: MenuItem = (title: "another", closure: {})
menuItems.append(item)
menuItems.append(item2)

答案 1 :(得分:2)

我和Kenneth的解决方案几乎相同。他打败了我。我添加的唯一额外内容是,再次将项目删除,您无法写menuItems[0].closure,您必须首先为menuItems[0]声明一个常量或变量,否则Playground会变得混乱(我怀疑它会在应用程序中引起问题)。我猜这与复杂性有关。

typealias tuple = (title: String, closure: () -> Void)

var menuItems = [tuple]()

menuItems.append((title: "any", closure: {}))
let anItem = menuItems[0]
anItem.closure
anItem.title

答案 2 :(得分:0)

2和3的歧义似乎是由于Swift编译器错误,直接使用menuItems[0].closure导致编译器分段错误。

删除元组的括号后,

1工作正常,这似乎也是不合逻辑的。

menuItems.append(title: "any", closure: {})

无论如何,我希望在将来的Swift /编译器更新中改变/中断。