Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift任何不访问结构方法的数组_Arrays_Swift_Swift2 - Fatal编程技术网

Arrays Swift任何不访问结构方法的数组

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

因此,我在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])
~~~~~^~~ ~~~

游乐场执行失败:/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