Swift 方法 - 多个参数 "extra argument in call" 错误

Swift Method - Multiple Parameters "extra argument in call" Error

我正在尝试在我的代码中使用方法。

我创建了一个新的 swift 文件,名为: ClipManager.swift

哪个有我的保存功能:

class ClipManager{
func SaveMethod(publicDatabase: CKDatabase, myRecord:CKRecord ) -> CKRecord  
{

    publicDatabase.saveRecord(myRecord, completionHandler:
        ({returnRecord, error in
            if let err = error {
                self.notifyUser("Save Error", message:
                    err.localizedDescription)
            } else {
                dispatch_async(dispatch_get_main_queue()) {
                    self.notifyUser("Success",
                        message: "Record saved successfully")
                }

                ///self.currentRecord = myRecord
            }
        }))
/// return myRecord
}
}

我正在尝试从我的 viewcontroller.swift 文件中调用它:

let currentRecord = ClipManager.SaveMethod(publicDatabase, myRecord)

但我收到以下错误:

extra argument in call

这里有两处错误:

  • 您正在尝试静态调用 non-class 方法
  • 您在通话中缺少 myRecord:

要使其正常工作,您必须按以下方式编写函数定义

class func SaveMethod(publicDatabase: CKDatabase, myRecord:CKRecord ) -> CKRecord {
    ...
}

调用必须类似于

let currentRecord = ClipManager.SaveMethod(publicDatabase, myRecord: myRecord)

好吧,第一个问题是 SaveMethod 是一个实例方法。即应该在实例上调用而不是 class。编译器告诉您有一个额外的参数,因为当您在此实例的 class 上调用实例方法时,它希望您提供该方法应绑定到的实例。例如:

let myClipManager = ClipManager()
let mySaveMethod = ClipManager.SaveMethod(myClipManager)
let currentRecord = mySaveMethod(publicDB, myRecord: myRecord)

这相当于下面的

let myClipManager = ClipManager()
let currentRecord = myClipManager.SaveMethod(publicDB, myRecord: myRecord)

虽然第二种方法更容易理解,或者您可以将 SaveMethod 声明为 class func,它可以直接在 class.

上调用

关于你为什么需要声明第二个参数的名称而不是第一个参数的问题,在 Swift 中,按照惯例,第一个参数的名称不是必需的,因为它应该从方法名称本身。例如:

func saveRecord(record: CKRecord, inDatabase: CKDatabase){}
// call the method
saveRecord(myRecord, inDatabase: myDatabase)

这里第一个参数名record可以省略,因为它是从方法名saveRecord推导出来的,显然是记录并保存了。不过,您可以强制要求第一个参数名称。例如:

func saveRecord(record record: CKRecord, inDatabase: CKDatabase){}
// the method should be called like this
saveRecord(record: myRecord, inDatabase: myDatabase)

此外,您可以为同一个参数指定 2 个名称,第一个在调用时使用,第二个在函数体内使用。例如:

func saveRecord(record aRecord: CKRecord, inDatabase db: CKDatabase) {
   // to use the passed record you should use the aRecord variable
   // to use the passed database you should use the db variable
   save(aRecord, db)
}
// but the method should be called in the following way
saveRecord(record: myRecord, inDatabase: myDatabase)

最后但并非最不重要的一点是,您可以使用以下方法省略为任何参数添加名称的必要性:

func saveRecord(record: CKRecord, _ db: CKDatabase) {}
// call the method
saveRecord(myRecord, myDatabase) // you don't have to name the second parameter because of the _ before its name

因此,当您在参数名称前面加上 _ 时,这意味着调用者可以在调用方法时省略此参数的名称,默认情况下 Swift 第一个参数名称无需在名称前加上 _

即可省略