2016-03-02 51 views
-1

所以,我在斯威夫特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's,但我也希望能夠訪問該數組的元素並相互使用它們的方法。但是,每當我嘗試使用Any數組時,它都不允許我這樣做,因爲它將讀取訪問的結構實例作爲任何類型讀取。

什麼是一種很好的方法來完成我想要做的事情?

+0

嘗試'枚舉令牌{case IntToken(Int); case StringToken(String)}' –

+1

要麼你需要強制downcast每個數組元素,或者你需要有同質類型的數組 –

+0

使用Enum你建議我得到這個錯誤: –

回答

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) 
+0

完美的作品 –

0

我稍微修改馬特的答案(接受的答案)來說明如何避免萬一崩潰一些表元素具有其他鍵入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)]