2017-09-20 12 views
5

Próbowałem przenieść moją aplikację do Swift 4, Xcode 9. Otrzymuję ten błąd. Pochodzi z frameworka 3rd party.odległość (od: do :) "jest niedostępna: Dowolna konwersja indeksu widoku String może się nie powieść w Swift 4; proszę odłączyć opcjonalne wskaźniki

odległość (od: do :) "jest niedostępna: Dowolna konwersja indeksu widoku ciągu może się nie powieść w Swift 4; Proszę rozpakować opcjonalnych indeksów

func nsRange(from range: Range<String.Index>) -> NSRange { 
    let utf16view = self.utf16 
    let from = range.lowerBound.samePosition(in: utf16view) 
    let to = range.upperBound.samePosition(in: utf16view) 
    return NSMakeRange(utf16view.distance(from: utf16view.startIndex, to: from), // Error: distance(from:to:)' is unavailable: Any String view index conversion can fail in Swift 4; please unwrap the optional indices 
         utf16view.distance(from: from, to: to))// Error: distance(from:to:)' is unavailable: Any String view index conversion can fail in Swift 4; please unwrap the optional indices 
} 
+0

https://stackoverflow.com/a/30404532/2083655 – Silmaril

+3

Swift 4 ma wbudowane metody konwertowania między zakresami String i NSString, dlatego nie trzeba już tego rozszerzenia. Zapoznaj się z najnowszą aktualizacją do https://stackoverflow.com/a/30404532/1187415. –

+0

Naprawdę świetnie, cieszę się, widziałem twój komentarz, prawie ominął :) dzięki – AamirR

Odpowiedz

-1

Błąd mówi, że odległości są generowania są OPCJE i należy odwinąć. Spróbuj tego:

func nsRange(from range: Range<String.Index>) -> NSRange { 
    let utf16view = self.utf16 
    guard let lowerBound = utf16view.distance(from: utf16view.startIndex, to: from), let upperBound = utf16view.distance(from: from, to: to) else { return NSMakeRange(0, 0) } 
    return NSMakeRange(lowerBound, upperBound) 
} 

Jednak zysk może być traktowane lepiej w rachunku guard. Zalecam wykonanie zwracanego typu funkcji NSRange? i sprawdzenie zerowej wartości w każdym miejscu, w którym wywoływana jest funkcja, aby uniknąć zwracania niedokładnych wartości.

+0

Jego błąd rzucania 'Initializer dla wiązania warunkowego musi mieć typ opcjonalny, a nie 'String.UTF16View.IndexDistance' (alias" Int ")' –

-1

proszę sprawdzić:

let dogString = "Dog‼" 
let range = dogString.range(of: "")! 

// To jest za pomocą Zakres

let strRange = dogString.range(range: range) 
print((dogString as NSString).substring(with: strRange!)) // 

extension String { 
    func range(range : Range<String.Index>) -> NSRange? { 
     let utf16view = self.utf16 
     guard 
      let from = String.UTF16View.Index(range.lowerBound, within: utf16view), 
      let to = String.UTF16View.Index(range.upperBound, within: utf16view) 
     else { return nil } 
     let utf16Offset = utf16view.startIndex.encodedOffset 
     let toOffset = to.encodedOffset 
     let fromOffset = from.encodedOffset 
     return NSMakeRange(fromOffset - utf16Offset, toOffset - fromOffset) 
    } 
} 

// To jest za pomocą NSRange

let strNSRange = dogString.range(nsRange: NSRange(range, in: dogString)) 
print((dogString as NSString).substring(with: strNSRange!)) // 

extension String { 
    func range(nsRange: NSRange) -> NSRange? { 
     guard 
      let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex), 
      let to16 = utf16.index(utf16.startIndex, offsetBy: nsRange.length, limitedBy: utf16.endIndex), 
      let from = from16.samePosition(in: self), 
      let to = to16.samePosition(in: self) 
      else { return nil } 
     return NSMakeRange(from.encodedOffset, to.encodedOffset) 
    } 
} 
6

można po prostu rozpakować opcjonalne wskaźniki takie jak to:

func nsRange(from range: Range<String.Index>) -> NSRange? { 
    let utf16view = self.utf16 
    if let from = range.lowerBound.samePosition(in: utf16view), let to = range.upperBound.samePosition(in: utf16view) { 
     return NSMakeRange(utf16view.distance(from: utf16view.startIndex, to: from), utf16view.distance(from: from, to: to)) 
    } 
    return nil 
} 
Powiązane problemy