2017-01-24 3 views
1

Letzte Nacht musste ich meinen Swift 2.3-Code in Swift 3.0 umwandeln und mein Code ist nach der Konvertierung ein Durcheinander. In Swift 2.3 hatte ich den folgenden Code:Swift 3: Wie macht man String-Bereiche?

let maxChar = 40; 
let val = "some long string"; 
var startRange = val.startIndex; 
var endRange = val.startIndex.advancedBy(maxChar, limit: val.endIndex); 
let index = val.rangeOfString(" ", options: NSStringCompareOptions.BackwardsSearch , range: startRange...endRange , locale: nil)?.startIndex; 

Xcode meinen Code dieses umgewandelt, die nicht funktioniert:

let maxChar = 40; 
let val = "some long string"; 
var startRange = val.startIndex; 
var endRange = val.characters.index(val.startIndex, offsetBy: maxChar, limitedBy: val.endIndex); 
let index = val.range(of: " ", options: NSString.CompareOptions.backwards , range: startRange...endRange , locale: nil)?.lowerBound 

Der Fehler ist in dem Parameter range in val.rage, sagen Nein ' ... 'Kandidaten erzeugen den erwarteten kontextuellen Ergebnistyp' Range? '.

Ich versuchte Range(startRange...endRange) als suggestd in der Dokumentation verwenden, aber ich bin en Fehler immer sagen: connot aufrufen initiliazer für Typ ClosedRange < _> mit einer arguement Liste des Typs (ClosedRange). Es scheint, als würde ich etwas Fundametnales vermissen.

Jede Hilfe wird geschätzt. Danke!

+0

Sie sind also für den letzten Platz suchen? – matt

+0

Dies wird in einer Schleife sein, um die lange Saite in kleinere Abschnitte zu zerhacken. –

+0

Richtig, Sie müssen meine Antwort unten anpassen, aber es wird Sie auf jeden Fall starten. (Ich verstehe immer noch nicht, was du wirklich machst, denn du kannst die Zeichenfolge in einem Zug in Leerzeichen aufteilen, wenn das dein Ziel ist.) – matt

Antwort

0

Einfache Antwort: Die grundlegende Sache, die Sie vermissen, ist, dass eine geschlossene Reichweite sich jetzt von einer Reichweite unterscheidet. Ändern Sie also startRange...endRange in startRange..<endRange.

Genauer gesagt, hier ist eine gekürzte Version des Codes (ohne maxChar Teil):

let val = "some long string"; 
var startRange = val.startIndex; 
var endRange = val.endIndex; 
let index = val.range(
    of: " ", options: .backwards, range: startRange..<endRange)?.lowerBound 
// 9 

Jetzt Sie, dass als Basis verwenden können, um tatsächlich gewünschte Funktionalität wiederherzustellen.


Wenn jedoch alles, was Sie tun möchten, ist die Zeichenfolge aufgeteilt, dann das Rad neu zu erfinden Art von albern ist:

let arr = "hey ho ha".characters.split(separator:" ").map{String($0)} 
arr // ["hey", "ho", "ha"] 
+0

Vielen Dank, es funktioniert jetzt! Stört es dich wenn ich frage warum es sich beschwert ...? –

+0

Hast du meine Antwort gelesen ???? Ein geschlossener Bereich ist kein Bereich. Das ist das erste, was ich gesagt habe. – matt

+0

Also muss ich einen zum endRange hinzufügen, um das letzte Zeichen in den Bereich aufzunehmen, oder? –

Verwandte Themen