问题
I'm moving from Swift 2 (probably, 2.3) to 3.0 and have a hard time correcting following code : Now, I know that String is not a collection anymore. How do I correct this particular code?
let separator = anyWord.indexOf("-")!
anyWord.substring(with: (anyWord.indices.suffix(from: anyWord.index(anyWord.startIndex, offsetBy: separator + 1))))
回答1:
As a possible improvement to @dfri's first solution, you could use the upperBound of String's range(of:) method (which is bridged from NSString) – which will give you the index after the (first occurrence of the) dash in your string.
import Foundation
let anyWord = "foo-bar"
if let separator = anyWord.range(of: "-")?.upperBound {
let bar = anyWord.substring(from: separator)
print(bar) // bar
}
Or even compacted into a crazy single binding using Optional's map(_:) method:
if let bar = (anyWord.range(of: "-")?.upperBound).map(anyWord.substring(from:)) {
print(bar) // bar
}
Although note that the general solution to the problem of 'String not being a collection anymore', is to use string.characters instead, which is a Collection.
回答2:
I'm slightly uncertain as to what you want to achieve, but it seems you'd like, for e.g. a string foo-bar, to construct a substring after a given separator, e.g. bar given foo-bar.
You could achieve this in less complicated fashions than the method you're attempting to implement.
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
}
Or, as another alternative, use Collection's split(separator:maxSplits:omittingEmptySubsequences:) method applied to the .characters (collection):
let anyWord = "foo-bar"
if let chars = anyWord.characters
.split(separator: Character("-"), maxSplits: 1)
.dropFirst(1).last {
let bar = String(chars)
print(bar) // bar
}
Or, as another alternative, using the components(separatedBy: "-") method of String:
import Foundation
let anyWord = "foo-bar"
let bar = anyWord.components(separatedBy: "-").dropFirst(1).reduce("", +)
print(bar) // bar
来源:https://stackoverflow.com/questions/40483621/value-of-string-has-no-member-indices-moving-to-swift-3-0