2014-09-27 100 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"))