Swift 2:如何将子字符串带到字符的第一个索引?

时间:2016-03-11 21:56:48

标签: swift

我对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?'")

对此有任何帮助表示赞赏。谢谢。

3 个答案:

答案 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))),因为它会返回子字符串