如何在Swift代码中将元组追加到数组对象?

yos*_*nbo 9 swift xcode6

我搜索谷歌,但我找不到一种方法将新元素追加到Swift中的数组对象.出现错误代码"Missing arguments fot parameter"name in in call".我的代码被遵循.

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
))
Run Code Online (Sandbox Code Playgroud)

如果你知道任何解决方案,我会很高兴.谢谢.

vac*_*ama 10

更有趣的解决方法:

arrayObj += [(id: idInt, name: nameString)]
Run Code Online (Sandbox Code Playgroud)

arrayObj.append([(id: idInt, name: nameString)][0])
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果你使用typealias:

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

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

arrayObj.append((id: idInt, name: nameString))
Run Code Online (Sandbox Code Playgroud)

编辑:

还有一个解决方法:

arrayObj.insert((id: idInt, name: nameString), atIndex:index)
Run Code Online (Sandbox Code Playgroud)


Ant*_*nio 8

只需将元组分配给临时变量:

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

arrayObj.append(tuple)
Run Code Online (Sandbox Code Playgroud)

不确定为什么它不起作用 - 只需检查一个函数,如下所示:

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"))
Run Code Online (Sandbox Code Playgroud)

结果:该函数有效,数组方法没有.

更新:在游乐场中尝试此代码:

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"))
Run Code Online (Sandbox Code Playgroud)

结果:它在传递tuple变量时起作用doSomething- 使用文字元组而不是,尽管编译器消息不同:

'((param1: Int, param2: String)) ->()' does not have a member named 'doSomething'
Run Code Online (Sandbox Code Playgroud)

显然,将文字元组传递给泛型类的方法(其中元组是泛型类型)未被编译器正确处理.

更新#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"))
Run Code Online (Sandbox Code Playgroud)

所以它绝对是一个只与泛型类相关的问题.


Dán*_*agy 7

我只想澄清一些事情:

如果您有一个带有命名元素的元组数组,就像在答案中一样,您可以使用下面描述的语法将元素添加到数组中:

arrayObj.append(id: 1, name: "TestName")
Run Code Online (Sandbox Code Playgroud)

如果你有一个没有命名元素的元组数组,如下所示:

var arrayObj: [(Int, String)] = []
Run Code Online (Sandbox Code Playgroud)

用这个:

arrayObj.append(1, "TestName")
Run Code Online (Sandbox Code Playgroud)

如果您为元组创建了一个typealias,则可以使用元组语法将元素添加到列表中:

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

arrayObj.append((1, "TestName"))
Run Code Online (Sandbox Code Playgroud)