Невозможно вызвать 'append' со списком аргументов типа '(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, исправления или комментарии по моему алгоритму также приветствуются:)
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'
Ошибка возникает из-за 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...]