2014-09-27 93 views
9

我搜索谷歌,但我不能找到一種方法來追加新的元素數組對象在Swift中。 出現錯誤代碼「調用時缺少參數fot參數」名稱「。 我的代碼被關注。如何將元組追加到Swift代碼中的數組對象?

var arrayObj: [(id: Int, name: String)] = [] 
var idInt: Int = 1 
var nameString: String = "hoge" 
arrayObj.append((  // ----> "Missing arguments fot parameter "name" in call" 
    id: idInt, 
    name: nameString 
)) 

如果你知道任何解決方案,我會很高興。 謝謝。

+0

如果您使用'typealias'它的作品。看到我更新的答案。 – vacawama 2014-09-27 15:55:20

回答

8

元組只是分配給一個臨時變量:

let tuple = (  
    id: idInt, 
    name: nameString 
) 

arrayObj.append(tuple) 

不知道爲什麼它不工作的方式 - 只需檢查上的功能,如:

var array: [(param1: Int, param2: String)] = [] 

func test(x: (param1: Int, param2: String)) { 
    println(x) 
} 

test((param1: 2, param2: "Test")) 
array.append((param1: 2, param2: "Test")) 

結果:函數有效,數組方法不。

更新:嘗試在操場下面的代碼:

struct Test<T> { 
    func doSomething(param: T) { 
     println(param) 
    } 
} 

var test = Test<(param1: Int, param2: String)>() 
let tuple = (param1: 2, param2: "Test") 
test.doSomething(tuple) 
test.doSomething((param1: 2, param2: "Test")) 

結果:經過tuple變量時doSomething它的工作原理 - 用文字代替元組沒有,儘管編譯器消息是不同的:

'((param1: Int, param2: String)) ->()' does not have a member named 'doSomething' 

顯然傳遞一個字面元組到一個通用的類(其中,該元組是通用型)的方法,沒有正確地由編譯器處理。

更新#2:我反覆試了在非通用類,但使用一個通用的方法,在這種情況下,它的工作:

struct Test { 
    func doSomething<T>(param: T) { 
     println(param) 
    } 
} 

var test = Test() 
let tuple = (param1: 2, param2: "Test") 
test.doSomething(tuple) 
test.doSomething((param1: 2, param2: "Test")) 

所以它肯定與泛型類問題只要。

+0

查看更新的答案 - 沒有解決方案,但它看起來像是一個編譯器問題 – Antonio 2014-09-27 15:49:18

+0

這是一個有趣的分析,安東尼奧。它當然看起來像一個編譯器問題。 – vacawama 2014-09-27 16:29:18

+0

哇,偉大的調查工作 - 'array.append((param1:2,param2:「Test」))'從來沒有工作;似乎你已經明白了爲什麼。 – 2014-09-27 18:58:22

10

更多樂趣解決方法:

arrayObj += [(id: idInt, name: nameString)] 

arrayObj.append([(id: idInt, name: nameString)][0]) 

奇怪的是,這個工程如果使用typealias

typealias MyData = (id: Int, name: String) 

var arrayObj: [MyData] = [] 
var idInt: Int = 1 
var nameString: String = "hoge" 

arrayObj.append((id: idInt, name: nameString)) 

編輯:

還有一個解決辦法:

arrayObj.insert((id: idInt, name: nameString), atIndex:index) 
+0

+1爲您的第二個解決方案 - 我喜歡它,並解決了問題,但問題仍然沒有答案 - 懷疑編譯器錯誤 – Antonio 2014-09-27 16:16:42

+0

謝謝。我明白:D – yoshinbo 2014-09-27 23:19:18

7

我只是想清楚一些事情:

如果你有一個陣元組的名爲元素,就像答案,你可以使用下面描述的語法將元素添加到陣列:

arrayObj.append(id: 1, name: "TestName") 

如果有陣列未命名的元素,像這樣的元組:

var arrayObj: [(Int, String)] = [] 

使用這樣的:

arrayObj.append(1, "TestName") 

如果你創建了一個typealias元組,您可以添加元素列表與元組語法:

typealias MyTuple = (Int, String) 
var arrayObj: [MyTuple] = [] 

arrayObj.append((1, "TestName"))