2017-08-01 109 views
7

我使用下面的代碼從一個NSRange一個String子:字符串,字符串,範圍,NSRange斯威夫特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]) 
} 

(通過:https://mjtsai.com/blog/2016/12/19/nsregularexpression-and-swift/

當我和斯威夫特4編譯(9B4的Xcode),我獲取該聲明startend兩條線以下錯誤:

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

我我很困惑,因爲我沒有使用init。

我該如何解決這個問題?

回答

12

使用範圍(_,在:)到NSRange轉換爲範圍在斯威夫特4

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

的Xcode迫使我修改代碼如下:'FUNC子(與nsrange:NSRange) - >字符串? {rangerange(nsrange,in:self)else {return nil} return String(self [range]) } – Koen

+1

如果你讓這個函數返回一個子串而不是一個字符串,你將不會有轉換結果。 –

+0

啊,我沒有意識到Substring是一種類型,我認爲這是一個錯字。 – Koen

4

與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))