Ну первый вопрос в том, что 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 имя первого параметра опущено без необходимости предшествовать его имени с помощью _
Не являются статическими методами в Swift, которым предшествует ' класс func'? – Arc676
Помните, что 'saveRecord: completHandler' работает асинхронно. Обработчик завершения называется намного позже после завершения метода. Невозможно вернуть 'returnRecord'. – vadian