Swift with target-git: существуют перегрузки для 'createCommitWithTree' с этими частично совпадающими списками параметров
Я использую target-git со Swift и не могу скомпилировать метод GTRepository.createCommitWithTree.
При желании метод может быть вызван без параметров author: GTSignature и committer: GTSignature.
Я новичок в Swift и перегрузке функций. Я хотел бы знать, как структурировать это так, чтобы это скомпилировалось.
Мой код использует все типы, указанные в методе target-git:
func commitTree ( tree : GTTree ) {
let message : NSString
let author : GTSignature
let committer : GTSignature
let parents : NSArray
let updatingReferenceNamed : NSString
var error : NSError?
GTRepository.createCommitWithTree( tree, message, author, committer, parents, updatingReferenceNamed, &error )
}
В этом коде компилятор не может вызывать метод со списком аргументов этих типов. Компилятор предоставляет дополнительную информацию: "Перегрузки для 'createCommitWithTree' существуют с этими частично совпадающими списками параметров: (GTTree, сообщение: String, автор: GTSignature, коммиттер: GTSignature, родители: [AnyObject]?, updateReferenceNamed: String?), (GTTree, сообщение: строка, родители: [AnyObject]?, updateReferenceNamed: String?)"
Если я рефакторину, чтобы использовать типы, предложенные выше, компилятор не скомпилирует с "неоднозначной ссылкой на член 'createCommitWithTree'"
Как мне написать это для компиляции?
Спасибо
1 ответ
Не уверен, что у вас все еще проблемы с этим (наткнулся на этот старый вопрос без ответа при поиске чего-то еще), но есть несколько возможных проблем с вашим кодом, как он был опубликован. Во-первых, вы не будете передавать NSError по ссылке (при условии, что вы используете Swift 2). Кроме того, этот метод является методом экземпляра для GTRepository, а не методом класса, поэтому вы должны вызывать его для экземпляра репозитория. Вот как этот метод переводится в Swift:
// These all need to be defined somewhere earlier for the following code to function
let repo: GTRespository
let tree: GTTree
let commitMsg: String
let parentCommit: GTCommit?
let refName: String?
// And here's the actual code you would execute
var createdCommit: GTCommit?
do {
try createdCommit = repo.createCommitWithTree(tree, message: commitMsg, parents: parentCommit?, updatingReferenceNamed: refName?)
} catch let error as NSError {
NSLog("Error creating commit: \(error.domain)")
}
if createdCommit != nil {
// Do something with your new commit
}
Удачи! Перевод Objective-Git на Swift может показаться странным из-за широкого использования NSErrors для передачи по ссылке и случайного bool, но этот конкретный метод должен быть довольно простым в использовании, если вы завершили его с помощью do/try/ловить.