Не удается вызвать «добавить» со списком аргументов типа «(Range‹String.Index›)»

Ошибка, которую я вижу, это заголовок: Cannot invoke 'append' with an argument list of type '(Range<String.Index>)'

Практикуя чередование строк в Swift, я пытаюсь добавить подстроку одной строки к другой. Этот другой вопрос касается добавления одной строки к другой, что не является моим вопросом. И этот другой вопрос совершенно другой выброшена ошибка. Документация Swift по строкам и символам не кажется охватывает добавление подстроки к строке.

Эта строка (и аналогичная) выдает ошибку.

result.append(str2.index(after: str2Index)..<str2.endIndex)

Как решить эту проблему и добавить подстроку в строку?

var str1 = "abcde"
var str2 = "fgh"
print(str1) // prints 'abcde'
print(str2) // prints 'fgd'

var str1Index = str1.startIndex
var str2Index = str2.startIndex
var result = String()
var resultIndex = result.startIndex

while str1Index != str1.endIndex && str2Index != str2.endIndex {
    result.insert(str1[str1Index],at: resultIndex)
    str1Index = str1.index(after: str1Index)
    resultIndex = result.index(after: resultIndex)

    result.insert(str2[str2Index], at: resultIndex)
    resultIndex = result.index(after: resultIndex)
    str2Index = str2.index(after: str2Index)
}

if str1Index != str1.endIndex {
    // This does not work, throws above mentioned error 
    result.append(str2.index(after: str2Index)..<str2.endIndex)
} else if str2Index != str2.endIndex {
    // This does not work, throws above mentioned error
    result.append(str1.index(after: str1Index)..<str1.endIndex)
}

print(result) // should print 'afbgchde'

PS, исправления или комментарии к моему алгоритму также приветствуются :)


person NonCreature0714    schedule 22.10.2018    source источник
comment
Вам нужно конвертировать Range в NSRange?   -  person onnoweb    schedule 22.10.2018
comment
Какую ошибку вы видите?   -  person Caleb    schedule 22.10.2018
comment
@Caleb ошибка, которую я вижу, - это название вопроса   -  person NonCreature0714    schedule 22.10.2018
comment
@ NonCreature0714 Это звучит как заголовок вопроса; вы должны уточнить свой вопрос, чтобы четко включить текст ошибки. Если меня обманули, то и другие тоже.   -  person Caleb    schedule 22.10.2018
comment
@onnoweb это предложение или вопрос?   -  person NonCreature0714    schedule 22.10.2018
comment
Зачем минусовать? Я отвечаю на комментарии, и многие хорошие вопросы по SO используют сообщение об ошибке в качестве заголовка вопроса.   -  person NonCreature0714    schedule 22.10.2018
comment
Пожалуйста, прочтите сообщение об ошибке. result равно String, а index(after возвращает Range<String.Index>. Это несоответствие типов.   -  person vadian    schedule 22.10.2018
comment
@vadian спасибо, я знаю, что это несоответствие типов, и я ценю комментарий. Я предпочитаю не перечислять различные актеры, которые пробовал, для краткости.   -  person NonCreature0714    schedule 23.10.2018


Ответы (2)


Вы можете использовать zip, чтобы соединить символы, соединить их в строку с помощью метода reduce(into:) и добавить оставшиеся символы из самой длинной строки:

let str1 = "abcde"
let str2 = "fgh"
print(str1) // prints 'abcde'
print(str2) // prints 'fgh'
let str1Count = str1.count
let str2Count = str2.count
let result = zip(str1,str2).reduce(into: "") {  
    $0.append($1.0)
    $0.append($1.1)
} + ( str1Count > str2Count ?
    str1.suffix(str1Count-str2Count) :
    str2.suffix(str2Count-str1Count) )

print(result) // 'afbgchde'
person Leo Dabus    schedule 22.10.2018

Ошибка возникает из-за того, что append() принимает в качестве аргумента один элемент коллекции (здесь: один Character), а не диапазон индексов.

Вы можете использовать += (или append(contentsOf:)) и индекс с односторонним диапазоном, чтобы добавить «остатки» обеих строк к результату:

result += str1[str1Index...]
result += str2[str2Index...]

Тестирование str1Index != str1.endIndex не требуется, в этом случае диапазон пуст.

Цикл while также можно упростить: resultIndex не нужен, если вы добавляете строку result:

var str1Index = str1.startIndex
var str2Index = str2.startIndex
var result = String()

while str1Index != str1.endIndex && str2Index != str2.endIndex {
    result.append(str1[str1Index])
    str1.formIndex(after: &str1Index)
    result.append(str2[str2Index])
    str2.formIndex(after: &str2Index)
}

result += str1[str1Index...]
result += str2[str2Index...]
person Martin R    schedule 22.10.2018