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/ловить.

Другие вопросы по тегам