所以,我在Swift 2中有以下代码:
struct IntToken {
var value:Int
init(val:Int) {
self.value = val
}
mutating func add(val:IntToken) {
self.value += val.value
}
}
var table = [Any]()
table.append(IntToken(val:3))
table.append(IntToken(val:4))
table[0].add(table[1])
这给了我以下错误
Playground execution failed: /var/folders/jx/bhltcyc90117d2wx_r82p4fr0000gn/T/./lldb/73237/playground71.swift:22:6: error: value of type 'Any' (aka 'protocol<>') has no member 'add'
table[0].add(table[1])
~~~~~^~~ ~~~
问题是,我正在尝试创建一个包含不同类型对象的数组,而不仅仅是IntToken
,但我还希望能够访问该数组的元素并将他们的方法相互使用。但是,每当我尝试使用Any数组时,它都不允许我这样做,因为它将所访问的struct实例读作任何类型。
什么是完成我想要做的事情的好方法?
答案 0 :(得分:1)
从原始结构开始:
struct IntToken {
var value:Int
init(val:Int) {
self.value = val
}
mutating func add(val:IntToken) {
self.value += val.value
}
}
这样做:
var table = [Any]()
table.append(IntToken(val:3))
table.append(IntToken(val:4))
var it = table[0] as! IntToken // take it out with cast and var ref
it.add(table[1] as! IntToken) // add with cast; `it` is now IntToken(val:7)
table[0] = it // put it back in (if you want to)
答案 1 :(得分:0)
我略微修改了matt的答案(接受的答案),以显示如果某些表元素具有其他类型为IntToken的情况下如何避免崩溃。
var table:[Any] = []
table.append(IntToken(val:3))
table.append(IntToken(val:4))
if let it0 = table[0] as? IntToken,
let it1 = table[1] as? IntToken {
var it0 = it0
it0.add(it1)
table[0] = it0
}
print(table) // [IntToken(value: 7), IntToken(value: 4)]
我更喜欢修改你的IntToken
struct IntToken {
var value:Int
func add1(token: IntToken)->IntToken {
var token = token
token.value += value
return token
}
}
并从中删除任何“变异”功能。现在,原始代码段可以修改为“更具功能性”且易于理解的版本
var table = [Any]()
table.append(IntToken(value:3))
table.append(IntToken(value:4))
if let it1 = table[1] as? IntToken,
let v = (table[0] as? IntToken)?.add1(it1) {
table[0] = v
}
print(table) // [IntToken(value: 7), IntToken(value: 4)]