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

标签 swift methods cloudkit

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

我创建了一个新的 swift 文件,命名为: 剪辑管理器.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

最佳答案

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

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 中省略第一个参数名称而不用需要在其名称前加上 _

关于Swift 方法 - 多个参数 "extra argument in call"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34898490/

相关文章:

swift - 子类化自定义 UIViewController 时出现内存泄漏

java - 使用非静态方法而不将其引用到对象?

ios - 以 CKException 类型的未捕获异常终止

条件下的 Swift 自定义 segue

swift - 使用多个按钮自定义警报 View

ios - iPhone Plus 和 X 中 Storyboard和模拟器的 View 不同

java - 如何解决此错误,无法从静态上下文引用非静态方法

从没有自定义头文件的多个 C 文件调用方法,Makefile 链接

ios - 如何使用查询在 swift 中获取 cloudkit 数据

ios - CKFetchNotificationChangesOperation 有时不返回更新、删除通知