2016-01-20 1 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

Не являются статическими методами в Swift, которым предшествует ' класс func'? – Arc676

+1

Помните, что 'saveRecord: completHandler' работает асинхронно. Обработчик завершения называется намного позже после завершения метода. Невозможно вернуть '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 

Итак, когда вы перед именем параметра с _ это означает, что вызывающий может опустить имя этого параметра при вызове метода и по умолчанию в Swift имя первого параметра опущено без необходимости предшествовать его имени с помощью _

+0

Благодарим вас за тот самый ответ. Теперь я перейду к методу экземпляра. – Malorrr

1

Есть две вещи неправильно здесь:

  • вы пытаетесь вызвать метод неклассовых статически
  • Вы пропускаете myRecord: в вызове:

Чтобы получить его вам необходимо написать определение функции следующим образом:

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

и вызов должен выглядеть как

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

Благодарим за помощь. Два вопроса: Если я позвоню этому экземпляру, как это сделать, сделав ссылку на него? 'let currentRecord = ClipManager()' и ... Почему мне нужно объявить имя второго параметра, который я передаю, но не первый? – Malorrr