Swift方法 - 多个参数“调用中的额外参数”错误

时间:2016-01-20 11:14:00

标签: swift methods cloudkit

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

我创建了一个名为的新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)

但是我收到以下错误:

  

呼叫中的额外参数

2 个答案:

答案 0 :(得分:1)

这里有两件事是错的:

  • 你试图静态调用非类方法
  • 您错过了通话中的myRecord:

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

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

并且调用必须类似于

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

答案 1 :(得分:1)

第一个问题是SaveMethod是一个实例方法。应该在实例而不是类上调用。编译器告诉你有一个额外的参数,因为当你在这个实例的类上调用一个实例方法时,它期望你提供该方法应该绑定的实例。例如:

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声明为类func,可以在类上直接调用。

关于为什么需要声明第二个参数的名称而不是第一个参数的问题,在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中省略第一个参数名称而不需要在其名称前面加上_