" String"的价值没有会员指数' - 转到Swift 3.0

时间:2016-11-08 09:46:20

标签: swift swift3

我从Swift 2(可能是2.3)迁移到3.0并且很难纠正以下代码: 现在,我知道String不再是一个集合了。如何更正此特定代码?

let separator = anyWord.indexOf("-")!

anyWord.substring(with: (anyWord.indices.suffix(from: anyWord.index(anyWord.startIndex, offsetBy: separator + 1))))

2 个答案:

答案 0 :(得分:2)

我对你想要达到的目标略显不确定,但似乎你想要,例如,字符串foo-bar,用于在给定的分隔符之后构造子字符串,例如barfoo-bar

你可以用比你试图实现的方法更复杂的方式来实现这一目标。

E.g。

let anyWord = "foo-bar"

if let separator = anyWord.characters.index(of: "-") {
    let subStartIndex = anyWord.characters.index(after: separator)
    let bar = anyWord[subStartIndex..<anyWord.endIndex]
    print(bar) // bar
}

或者,作为另一种选择,使用应用于Collection(集合)的.characters split(separator:maxSplits:omittingEmptySubsequences:)方法:

let anyWord = "foo-bar"

if let chars = anyWord.characters
    .split(separator: Character("-"), maxSplits: 1)
    .dropFirst(1).last {
    let bar = String(chars)
    print(bar) // bar
}

或者,作为另一种选择,使用String的{​​{3}}方法:

import Foundation

let anyWord = "foo-bar"

let bar = anyWord.components(separatedBy: "-").dropFirst(1).reduce("", +)
print(bar) // bar

答案 1 :(得分:2)

作为对@dfri's first solution的可能改进,您可以使用upperBound的{​​{1}} range(of:)方法(来自String的桥接) - 其中将在你的字符串中(第一次出现)破折号后给你索引。

NSString

甚至使用import Foundation let anyWord = "foo-bar" if let separator = anyWord.range(of: "-")?.upperBound { let bar = anyWord.substring(from: separator) print(bar) // bar } 的{​​{3}}方法压缩成疯狂的单一绑定:

Optional

虽然注意到“字符串不再是一个集合”问题的一般解决方案,但是使用if let bar = (anyWord.range(of: "-")?.upperBound).map(anyWord.substring(from:)) { print(bar) // bar } 代替, 一个string.characters