Arrays Swift任何不访问结构方法的数组
因此,我在Swift 2中有以下代码:Arrays Swift任何不访问结构方法的数组,arrays,swift,swift2,Arrays,Swift,Swift2,因此,我在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
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])
~~~~~^~~ ~~~
游乐场执行失败:/var/folders/jx/bhlcyc90117d2wx\u r82p4fr0000gn/T//lldb/73237/playground71。swift:22:6:错误:类型为“Any”(又名“protocol”)的值没有成员“add”
表[0]。添加(表[1])
~~~~~^~~ ~~~
问题是,我正在尝试创建一个数组,该数组将包含不同类型的对象,不仅是IntToken
,而且我还希望能够访问该数组的元素并在彼此上使用它们的方法。但是,每当我尝试使用Any数组时,它都不允许我这样做,因为它将访问的结构实例作为Any类型读取
什么是完成我想做的事情的好方法 从原始结构开始:
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)
我稍微修改了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)]
尝试
enum令牌{case IntToken(Int);case StringToken(String)}
您需要强制向下转换每个数组元素,或者需要使用您建议的Enum创建同质类型的数组。我收到以下错误:Playerd执行失败:/var/folders/jx/bhlcyc90117d2wx\u r82p4fr0000gn/T//lldb/73237/playground85。swift:20:14:错误:无法将“IntToken”类型的值转换为预期的参数类型“Token”table.append(IntToken(val:3))^~~~~~~~~~~~~~~~~/var/folders/jx/bhltcyc90117d2wx\u r82p4fr0000gn/T//lldb/73237/playground85.swift:21:14:错误:无法将“IntToken”类型的值转换为预期的参数类型“Token”table.append(IntToken(val:4))^~~~~~~~~~~~~~~~~~~~/var/folders/jx/bhltcyc90117d2wx\u r82p4fr0000gn/T//lldb/73237/playder