web-dev-qa-db-ja.com

文字列、部分文字列、範囲、NSRange in Swift 4

次のコードを使用して、StringからNSRange部分文字列を取得しています。

func substring(with nsrange: NSRange) -> String? {
    guard let range = Range.init(nsrange)
        else { return nil }
    let start = UTF16Index(range.lowerBound)
    let end = UTF16Index(range.upperBound)
    return String(utf16[start..<end])
}

(経由: https://mjtsai.com/blog/2016/12/19/nsregularexpression-and-Swift/

Swift 4(Xcode 9b4))でコンパイルすると、startendを宣言する2行で次のエラーが発生します。

'init' is unavailable
'init' was obsoleted in Swift 4.0

Initを使用していないため、混乱しています。

どうすれば修正できますか?

13
Koen

Range(_、in :)を使用して、NSRangeをRange in Swift 4。

extension String {
    func substring(with nsrange: NSRange) -> Substring? {
        guard let range = Range(nsrange, in: self) else { return nil }
        return self[range]
    }
}
21
Charles Srstka

Swift 4を使用すると、この方法で部分文字列を取得できます。

  1. インデックスからの部分文字列

    let originStr = "Test"
    let offset = 1
    let str = String(originStr.suffix(from: String.Index.init(encodedOffset: offset)))
    
  2. 索引付けするサブストリング

    let originStr = "Test"
    let offset = 1
    String(self.prefix(index))
    
5
Nguyen Van Dung