使用自定义方法将自定义对象添加到数组 Swift 问题

Add custom object to array with custom method Swift issue

我是 Swift 的新手,所以我在这里问的不是它为什么不起作用,而是为什么它起作用。我期待一些不同的东西。我有三个 class,一个叫做 User.swift,带有用户变量、get 方法和构造函数,另一个叫做 UserList.swift,带有一个数组和一个自定义方法来向它添加对象,另一个只是我使用此方法将 User 添加到此数组。 如您所见,当我调用 listManager.addUser(...) 时,我希望在括号之间写下类似这样的内容:name: "random name", surname: "random surname", age: 0 但这给了我一个编译错误 "Extraneous argument label 'name:' in call"。如果我删除 "name:" 它会起作用,但如果我删除 "surname:" 或 "age:" 它不会。 我会把我的代码放在这里(它像我说的那样工作,我只需要明白为什么)。

User.swift

import Foundation

class User: NSObject {

private var name: String
private var surname: String
private var age: Int

init(name: String, surname: String, age: Int){
    self.name = name
    self.surname = surname
    self.age = age;
}

func getName() -> String{
    return self.name
}

func getSurname() -> String{
    return self.surname
}

func getAge() -> Int{
    return self.age
}

}

UserList.swift

import UIKit

var listManager: UserList = UserList()

class UserList: NSObject {

var userList = [User]()

func addUser(name: String, surname: String, age: Int){
    userList.append(User(name: name, surname: surname, age: age))
}

}

Class 其中我使用 addUser()

listManager.addUser("random name", surname: "random surname", age: 0)

如您所见,没有 "name:" 标签

这似乎是编写具有多个参数且没有外部参数名称的函数时的错误。通常在您声明函数的方式中,您应该期望按如下方式使用它:

listManager.addUser("random name", "random surname", 0)

但目前只有第一个参数按预期工作。奇怪的是,如果您使用 shorthand 外部参数名称并按如下方式声明函数:

func addUser(#name: String, #surname: String, #age: Int){
    userList.append(User(name: name, surname: surname, age: age))
}

您收到一条警告,指出第一个参数之后的每个参数已经是关键字参数名称,因此这绝对是一个错误

因为这是方法的外部参数名称规则。来自 the document:

Specifically, Swift gives the first parameter name in a method a local parameter name by default, and gives the second and subsequent parameter names both local and external parameter names by default. This convention matches the typical naming and calling convention you will be familiar with from writing Objective-C methods, and makes for expressive method calls without the need to qualify your parameter names.

如果你想这样称呼它:

listManager.addUser(name: "random name", surname: "random surname", age: 0)

您必须声明 addUser 如:

func addUser(#name: String, surname: String, age: Int){
//           ^ This forces the external parameter name
    // ...
}