我对Swift很新;我早上花了大量时间阅读StackOverflow并尝试了许多策略,但是徒劳无功,以实现以下目标:
我有一个字符串,说" 12345是你的号码!"
我想提取" 12345"变量。
在Java中,我做了类似的事情:
String myStr = "12345 is your number!";
return myStr.substring(0, myStr.indexOf(" "));
我如何在Swift中做类似的事情?我不想对任何关于结束指数的假设进行硬编码。它可能是5个字符,也可能不是。我只想把所有内容的子字符串带到第一次出现的" ",无论在哪里。
我到目前为止最接近的是:
var myMessage = "12345 is your number!"
myMessage.endIndex.advancedBy(myMessage.characters.count - myMessage.characters.indexOf(" "))
但它没有编译,因为我还没有完全理解("二元运算符' - '不能应用于Distance类型的操作数(又名&#) 39; Int')和' String.CharacterView.Index?'")
对此有任何帮助表示赞赏。谢谢。
答案 0 :(得分:6)
这样的事情应该有效:
myMessage.substringToIndex(myMessage.characters.indexOf(" ")!)
请注意,在此代码中,我强制解包可选项。如果您不能保证字符串中有该空格,那么将索引置于可选绑定中会更有意义。
使用可选绑定,它看起来像这样:
if let index = myMessage.characters.indexOf(" ") {
let result = myMessage.substringToIndex(index)
}
答案 1 :(得分:1)
您可以使用正则表达式,请尝试以下代码:
var myMessage = "12345 is your number!"
if let match = myMessage.rangeOfString("-?\\d+", options: .RegularExpressionSearch) {
print(myMessage.substringWithRange(match)) // 12345
let myNumber = Int(myMessage.substringWithRange(match)) // Then you can initialize a new variable
}
优点是此方法仅提取String
希望这个帮助;)
答案 2 :(得分:0)
使用 Swift 5 ,您可以使用:
myStr.prefix(upTo: myStr.firstIndex(of: " ") ?? myStr.startIndex)
您可能需要将其强制转换回字符串(String(myStr.prefix(upTo: myStr.firstIndex(of: " ") ?? myStr.startIndex))
),因为它会返回子字符串