Nic*_*ell 3 string substring swift swift4
Swift 4改变了字符串的工作方式.但是,似乎更复杂,更不易阅读.任何人都可以简化这个例子(简单地将String的第三个字母作为字符串)?(除了拆分线外.)
let myString="abc"
let thirdLetter = String(myString[myString.index(myString.startIndex, offsetBy: 2)])
Run Code Online (Sandbox Code Playgroud)
在斯威夫特4,你可以转换String myString到[Character]同Array(myString).然后你可以索引该数组,Int然后将其转换[Character]为String.
let myString = "abc"
let thirdLetter = String(Array(myString)[2]) // "c"
let firstTwo = String(Array(myString)[0..<2]) // "ab"
Run Code Online (Sandbox Code Playgroud)
如果你要在a上做很多操作String,通常最好转换并保持它[Character].
注意:我已经重新设计了这一部分,试图避免编译器可能进行的任何缓存优化.现在每种方法只测量一次,并为每种方法保留一个运行总计.
转换为Array索引并Int易于编写和读取,但它是如何执行的?为了回答这个问题,我在发布版本中测试了以下内容:
func time1(str: String, n: Int) -> (Double, String) {
// Method 1: Index string with String.Index, convert to String
let start = Date()
let a = String(str[str.index(str.startIndex, offsetBy: n)])
let interval = Date().timeIntervalSince(start)
return (interval, a)
}
func time2(str: String, n: Int) -> (Double, String) {
// Method 2: Convert string to array, index with Int, convert to String
let start = Date()
let a = String(Array(str)[n])
let interval = Date().timeIntervalSince(start)
return (interval, a)
}
func time3(str: String, n: Int) -> (Double, String) {
// Method 3: Use prefix() and last(), convert to String
let start = Date()
let a = String(str.prefix(n + 1).last!)
let interval = Date().timeIntervalSince(start)
return (interval, a)
}
func time4(str: String, n: Int) -> (Double, String) {
// Method 4: Use Leo Dabus' extensions
// https://stackoverflow.com/q/24092884/1630618
let start = Date()
let a = str[n]
let interval = Date().timeIntervalSince(start)
return (interval, a)
}
func time5(str: String, n: Int) -> (Double, String) {
// Method 5: Same as 2 but don't measure Array conversion time
let arr = Array(str)
let start = Date()
let a = String(arr[n])
let interval = Date().timeIntervalSince(start)
return (interval, a)
}
func test() {
for repetitions in [1, 10, 100, 1000] {
var input = ""
for _ in 0 ..< repetitions {
input.append("abcdefghijklmnopqrstuvwxyz")
}
var t = [0.0, 0.0, 0.0, 0.0, 0.0]
let funcs = [time1, time2, time3, time4, time5]
for i in 0 ..< input.count {
for f in funcs.indices {
let (interval, _) = funcs[f](input, i)
t[f] += interval
}
}
print("For string length \(input.count):")
for i in 0 ..< 5 {
print(String(format: "Method %d time: %.8f", i + 1, t[i]))
}
print("")
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Run Code Online (Sandbox Code Playgroud)For string length 26: Method 1 time: 0.00108612 Method 2 time: 0.00085294 Method 3 time: 0.00005889 Method 4 time: 0.00002104 Method 5 time: 0.00000405 For string length 260: Method 1 time: 0.00117570 Method 2 time: 0.00670648 Method 3 time: 0.00115579 Method 4 time: 0.00110406 Method 5 time: 0.00007111 For string length 2600: Method 1 time: 0.09964919 Method 2 time: 0.57621503 Method 3 time: 0.09244329 Method 4 time: 0.09166771 Method 5 time: 0.00087011 For string length 26000: Method 1 time: 9.78054154 Method 2 time: 56.92994779 Method 3 time: 9.02372885 Method 4 time: 9.01480001 Method 5 time: 0.03442019
分析:
[Character],它上面的索引操作非常快.(见方法5)| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |