我正在尝试在我的代码中使用方法。
我创建了一个名为的新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)
但是我收到以下错误:
呼叫中的额外参数
答案 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中省略第一个参数名称而不需要在其名称前面加上_