什么是Visual Basic" Mid"函数在Swift 4中?

时间:2017-10-17 22:55:53

标签: ios string swift4

使用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中做事的最好方法,那就行了,虽然看起来好像已经改变了这样做的最佳做法也可能已经改变。

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)

一种方法是使用dropFirstprefix的组合,然后使用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

dropFirstprefix是宽容的,如果没有足够的信件,也不会崩溃。他们只会给出一个截断的结果。根据您定义函数的方式,这是一个完全可以接受的实现。

另一种方法是使用数组下标。如果你这样做,你需要检查输入以避免数组索引超出范围致命错误:

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)")
}

将字符串输出到控制台,一次输出一个字符