使用Swift 4中处理字符串的新方法,我试图围绕如何从其他语言编写等效的Mid函数(visual basic等),以便
let testString = "0123456"
print Mid(testString, 2,4) // "1234" (or "2345" would work too)
This question是同样的想法,但是那里的一切都早于Swift 4.如果jlert的答案仍然是在Swift 4中做事的最好方法,那就行了,虽然看起来好像已经改变了这样做的最佳做法也可能已经改变。
答案 0 :(得分:2)
你可以这样做:
extension String {
func mid(_ startOffset: Int, _ length: Int) -> Substring {
let start = index(startIndex, offsetBy: startOffset, limitedBy: endIndex) ?? endIndex
let end = index(start, offsetBy: length, limitedBy: endIndex) ?? endIndex
return self[start ..< end]
}
}
let string = "0123456"
let result = string.mid(2, 4) // 2345
注意,这会返回一个Substring
,它可以提高内存效率。但是如果你想要一个String
,你可以这样做:
let result = String(string.mid(2, 4))
(或者您可以将其纳入mid
功能。)
答案 1 :(得分:1)
一种方法是使用dropFirst
和prefix
的组合,然后使用String
将结果转换回String
:
let testString = "0123456"
func mid(_ str: String, _ low: Int, _ count: Int) -> String {
return String(str.dropFirst(low).prefix(count))
}
print(mid(testString, 2,4)) // 2345
dropFirst
和prefix
是宽容的,如果没有足够的信件,也不会崩溃。他们只会给出一个截断的结果。根据您定义函数的方式,这是一个完全可以接受的实现。
另一种方法是使用数组下标。如果你这样做,你需要检查输入以避免数组索引超出范围致命错误:
func mid(_ str: String, _ low: Int, _ count: Int) -> String? {
guard low >= 0,
count >= 0,
low < str.count,
low + count <= str.count
else { return nil }
return String(Array(str)[low ..< low + count])
}
let testString = "abcdefghi"
if let result = mid(testString, 2, 4) {
print(result) // cdef
}
答案 2 :(得分:1)
我会采用不同的方法使用String.Index并返回一个Substring而不是一个新的String对象。您还可以添加前提条件以限制对该方法的不当使用:
func mid(_ string: String, _ positon: Int, length: Int) -> Substring {
precondition(positon < string.count, "invalid position")
precondition(positon + length <= string.count, "invalid substring length")
let lower = string.index(string.startIndex, offsetBy: positon)
let upper = string.index(lower, offsetBy: length)
return string[lower..<upper]
}
let testString = "0123456"
mid(testString, 2, length: 4) // "2345"
另一种选择是将该方法创建为字符串扩展名:
extension String {
func mid(_ positon: Int, length: Int) -> Substring {
precondition(positon < count, "invalid position")
precondition(positon + length <= count, "invalid substring length")
let lower = index(startIndex, offsetBy: positon)
let upper = index(lower, offsetBy: length)
return self[lower..<upper]
}
}
let testString = "0123456"
testString.mid(2, length: 4) // "2345"
答案 3 :(得分:1)
iOS 14,Swift 5 ...与vacawama的最佳答案相同,但作为扩展,因此它的代码更少:)
extension String {
func mid(_ low: Int, _ count: Int) -> String {
return String(self.dropFirst(low).prefix(count))
}
}
像这样使用它。
let pString = "01234567"
for i in 0 ..< 8 {
print("\(i) \(pString.mid(i,1)")
}
将字符串输出到控制台,一次输出一个字符