无法将'subSequence'类型的值(也称为'String.CharacterView')转换为在集合中键入'String'

U. *_*roz 20 string swift

我构建了一个从数据库中请求图像URL的webservis.而我想在迅速展示它.但是我在var photo line上发现了这个错误:

无法将'subSequence'类型的值(也称为'String.CharacterView')转换为在集合中键入'String'

let requestResponse = self.sendToServer(postUrl: "localhost",data:"abc")

let Seperated = requestResponse.characters.split(separator: " ")

var photo = Seperated[0] as String

let imageURL = URL(string: photo)
if let imageData = try? Data(contentsOf: imageURL!) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 31

考虑这样的事情:

let requestResponse = "some string"
let separated = requestResponse.characters.split(separator: " ")

if let some = separated.first {
    let value = String(some)

    // Output: "some"
}
Run Code Online (Sandbox Code Playgroud)


小智 26

最简单的解决方案。

let separated = requestResponse.characters.split(separator: " ").map { String($0) }
Run Code Online (Sandbox Code Playgroud)

  • 我花了一段时间才明白为什么这是必要的,但这是因为 split 返回一个“子字符串”对象而不是字符串。它很相似,但出于速度原因,如果您修改子字符串,它会从原始字符串修改,因此内存效率更高。因此,map 的作用是将每个“子字符串”转换为实际的字符串,这对于许多函数来说是必需的。希望这可以帮助其他人理解为什么这更有效。 (3认同)

Joo*_*ony 9

split返回 s 的列表Substring,因此我们必须将它们映射(转换)为Strings。为此,您只需将 传递SubstringStringsinit函数即可:

let separated = requestResponse.characters.split(separator: " ").map(String.init)
Run Code Online (Sandbox Code Playgroud)

  • swift 不是一种不好的语言,但它确实让很多简单的事情变得令人沮丧 (5认同)

小智 7

如果是Swift 4,您可以这样使用:

let separated = requestResponse.split(separator: " ")
var photo = String(separated.first ?? "")
Run Code Online (Sandbox Code Playgroud)


小智 5

一种使用高阶函数分割字符串来获取字符串的方法:

let splitStringArray = requestResponse.split(separator: " ").map({ (substring) in
    return String(substring)
})
Run Code Online (Sandbox Code Playgroud)