2016-01-20 54 views
0

我想在我的代码中使用方法。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

+2

前述的省略不是夫特静态方法由前面'级func'? – Arc676

+1

注意'saveRecord:completionHandler'以异步方式工作。完成处理程序在方法结束后稍后调用。返回'returnRecord'是不可能的。 – vadian

回答

1

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

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 

所以,当你与_先于参数的名称这意味着该呼叫者可以省略此参数的名称调用夫特的方法和通过默认当所述第一参数的名称,而不需要它的名称与一个_

+0

非常感谢您的答复。我现在将更改为实例方法。 – Malorrr

1

有两件事情错在这里:

  • 您尝试调用非类方法静态
  • 你缺少的呼叫myRecord:

得到它你必须按以下方式编写函数定义:

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

和呼叫必须看起来像

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

谢谢你的帮助。二quesions: 如果我把它称为一个实例,怎么会变成这样做,通过参考呢? '让currentRecord = ClipManager()' 和...为什么我要声明我传递的第二个参数的名称,但不是第一? – Malorrr

相关问题