【问题标题】:Cannot invoke 'append' with an argument list of type '(Range<String.Index>)'无法使用类型为“(Range<String.Index>)”的参数列表调用“附加”
【发布时间】:2018-10-22 20:30:37
【问题描述】:

我看到的错误是标题:Cannot invoke 'append' with an argument list of type '(Range&lt;String.Index&gt;)'

在 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、更正或 cmets 也表示赞赏 :)

【问题讨论】:

  • 是否需要将 Range 转换为 NSRange?
  • 您看到的错误是什么?
  • @Caleb 我看到的错误是问题的标题
  • 为什么要投反对票?我对 cme​​ts 有响应,关于 SO 的很多好问题都使用错误消息作为问题标题
  • 请阅读错误信息。 resultStringindex(after 返回 Range&lt;String.Index&gt;。这是类型不匹配。

标签: swift string substring interleave


【解决方案1】:

您可以使用 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'

【讨论】:

    【解决方案2】:

    发生错误是因为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...]
    

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多