Swift Any Array不访问Struct Methods

时间:2016-03-02 04:19:22

标签: 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(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实例读作任何类型。

什么是完成我想要做的事情的好方法?

2 个答案:

答案 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)]