2017-08-01 16 views
7

używam następujący kod, aby uzyskać String podciąg z NSRange:String, podciąg, Rząd, NSRange w Swift 4

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

(via: https://mjtsai.com/blog/2016/12/19/nsregularexpression-and-swift/)

Kiedy skompilować z Swift 4 (Xcode 9b4), otrzymuję następujące błędy dla dwóch linii, które deklarują start i end:

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

i jestem zdezorientowany, ponieważ nie używam init.

Jak mogę to naprawić?

Odpowiedz

12

Zastosowanie Range (_, w :) przekonwertować NSRange do zakresu w Swift 4.

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

Xcode zmusza mnie do ustalenia kodu następująco: 'funkcjono podciąg (z nsrange: NSRange) - > String? { straży wypuścić zakres = zakres (nsrange, w: self) else {return nil} return String (self [zakres]) } ' – Koen

+1

Jeśli sprawisz, że funkcja zwróci Substring zamiast String, nie będziesz mieć przekonwertować wynik. –

+0

Ah, nie wiedziałem, że Substring jest typem, myślałem, że to literówka. – Koen

4

Z Swift 4 możemy uzyskać podciągi w ten sposób.

  1. podciągu z indeksu

    let originStr = "Test" 
    let offset = 1 
    let str = String(originStr.suffix(from: String.Index.init(encodedOffset: offset))) 
    
  2. podciągu do indeksu

    let originStr = "Test" 
    let offset = 1 
    String(self.prefix(index))