我正在尝试管理(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)
任何解释或更好的方式来添加项目将不胜感激。
答案 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 /编译器更新中改变/中断。