我看到的错误是标题:Cannot invoke 'append' with an argument list of type '(Range<String.Index>)'
在Swift中练习字符串交织时,我试图将一个字符串的子字符串附加到另一个字符串。 This other question covers将一个字符串附加到另一个字符串,这不是我的问题。 And this other question是一个完全不同的错误。 The Swift documentation on Strings and Characters 似乎没有涵盖将子字符串追加到字符串中。
这一行(和类似的行)抛出错误。
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,对我的算法的更正或评论也很感激:)
答案 0 :(得分: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'
答案 1 :(得分:1)
发生错误是因为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...]