it-swarm.com.de

Wie kann ich String-Slicing-Subskripte in Swift 4 verwenden?

Ich habe den folgenden einfachen Code in Swift 3 geschrieben:

let str = "Hello, playground"
let index = str.index(of: ",")!
let newStr = str.substring(to: index)

Von Xcode 9 Beta 5 bekomme ich die folgende Warnung:

'substring(to:)' ist veraltet: Bitte verwenden Sie String Slicing-Index mit einem Operator 'Teilbereich von'.

Wie kann dieses Slicing-Index mit Teilbereich von in Swift 4 verwendet werden?

239
Kobe

Sie sollten eine Seite leer lassen, daher der Name "Teilbereich".

let newStr = str[..<index]

Dasselbe gilt für Teilbereich von Operatoren, lassen Sie die andere Seite einfach leer:

let newStr = str[index...]

Beachten Sie, dass diese Bereichsoperatoren eine Substring zurückgeben. Wenn Sie es in einen String konvertieren möchten, verwenden Sie die Initialisierungsfunktion von String:

let newStr = String(str[..<index])

Weitere Informationen zu den neuen Teilstrings hier .

306
Tamás Sengel

Teilstring (Swift 3) in String Slicing (Swift 4) umrechnen

Beispiele in Swift 3, 4:

let newStr = str.substring(to: index) // Swift 3
let newStr = String(str[..<index]) // Swift 4

let newStr = str.substring(from: index) // Swift 3
let newStr = String(str[index...]) // Swift 4 

let range = firstIndex..<secondIndex // If you have a range
let newStr = = str.substring(with: range) // Swift 3
let newStr = String(str[range])  // Swift 4

Schnell 4

Verwendungszweck

let text = "Hello world"
text[...3] // "Hell"
text[6..<text.count] // world
text[NSRange(location: 6, length: 3)] // wor

Code

import Foundation

extension String {
    subscript(value: NSRange) -> Substring {
        return self[value.lowerBound..<value.upperBound]
    }
}

extension String {
    subscript(value: CountableClosedRange<Int>) -> Substring {
        get {
            return self[index(at: value.lowerBound)...index(at: value.upperBound)]
        }
    }

    subscript(value: CountableRange<Int>) -> Substring {
        get {
            return self[index(at: value.lowerBound)..<index(at: value.upperBound)]
        }
    }

    subscript(value: PartialRangeUpTo<Int>) -> Substring {
        get {
            return self[..<index(at: value.upperBound)]
        }
    }

    subscript(value: PartialRangeThrough<Int>) -> Substring {
        get {
            return self[...index(at: value.upperBound)]
        }
    }

    subscript(value: PartialRangeFrom<Int>) -> Substring {
        get {
            return self[index(at: value.lowerBound)...]
        }
    }

    func index(at offset: Int) -> String.Index {
        return index(startIndex, offsetBy: offset)
    }
}
47
dimpiax

Die Konvertierung Ihres Codes in Swift 4 kann auch folgendermaßen durchgeführt werden: 

let str = "Hello, playground"
let index = str.index(of: ",")!
let substr = str.prefix(upTo: index)

Sie können den folgenden Code verwenden, um eine neue Zeichenfolge zu erhalten:

let newString = String(str.prefix(upTo: index))
21
Thyerri Mezzari

Kürzer in Swift 4:

var string = "123456"
string = String(string.prefix(3)) //"123"
string = String(string.suffix(3)) //"456"
19
ilnur

teilzeichenfolge (von: index)Konvertiert in[index ...]

Überprüfen Sie die Probe

let text = "1234567890"
let index = text.index(text.startIndex, offsetBy: 3)

text.substring(from: index) // "4567890"   [Swift 3]
String(text[index...])      // "4567890"   [Swift 4]
12
Den

Einige nützliche Erweiterungen:

extension String {
    func substring(from: Int, to: Int) -> String {
        let start = index(startIndex, offsetBy: from)
        let end = index(start, offsetBy: to - from)
        return String(self[start ..< end])
    }

    func substring(range: NSRange) -> String {
        return substring(from: range.lowerBound, to: range.upperBound)
    }
}
7
Johannes

Beispiel für die uppercasedFirstCharacter-Convenience-Eigenschaft in Swift3 und Swift4.

Die Eigenschaft uppercasedFirstCharacterNew veranschaulicht die Verwendung des String-Slicing-Indexes in Swift4.

extension String {

   public var uppercasedFirstCharacterOld: String {
      if characters.count > 0 {
         let splitIndex = index(after: startIndex)
         let firstCharacter = substring(to: splitIndex).uppercased()
         let sentence = substring(from: splitIndex)
         return firstCharacter + sentence
      } else {
         return self
      }
   }

   public var uppercasedFirstCharacterNew: String {
      if characters.count > 0 {
         let splitIndex = index(after: startIndex)
         let firstCharacter = self[..<splitIndex].uppercased()
         let sentence = self[splitIndex...]
         return firstCharacter + sentence
      } else {
         return self
      }
   }
}

let lorem = "lorem".uppercasedFirstCharacterOld
print(lorem) // Prints "Lorem"

let ipsum = "ipsum".uppercasedFirstCharacterNew
print(ipsum) // Prints "Ipsum"
6
Vlad

Sie können Ihre benutzerdefinierte subString-Methode mit der Erweiterung der Klasse String wie folgt erstellen:

extension String {
    func subString(startIndex: Int, endIndex: Int) -> String {
        let end = (endIndex - self.count) + 1
        let indexStartOfText = self.index(self.startIndex, offsetBy: startIndex)
        let indexEndOfText = self.index(self.endIndex, offsetBy: end)
        let substring = self[indexStartOfText..<indexEndOfText]
        return String(substring)
    }
}
5
Chhaileng

Erstellen von SubString (Präfix und Suffix) aus String mit Swift 4:

let str : String = "ilike"
for i in 0...str.count {
    let index = str.index(str.startIndex, offsetBy: i) // String.Index
    let prefix = str[..<index] // String.SubSequence
    let suffix = str[index...] // String.SubSequence
    print("prefix \(prefix), suffix : \(suffix)")
}

Ausgabe

prefix , suffix : ilike
prefix i, suffix : like
prefix il, suffix : ike
prefix ili, suffix : ke
prefix ilik, suffix : e
prefix ilike, suffix : 

Wenn Sie einen Teilstring zwischen zwei Indizes generieren möchten, verwenden Sie:

let substring1 = string[startIndex...endIndex] // including endIndex
let subString2 = string[startIndex..<endIndex] // excluding endIndex
4
Ashis Laha

Ich habe eine String-Erweiterung zum Ersetzen von 'String: subString:' geschrieben.

extension String {

    func sliceByCharacter(from: Character, to: Character) -> String? {
        let fromIndex = self.index(self.index(of: from)!, offsetBy: 1)
        let toIndex = self.index(self.index(of: to)!, offsetBy: -1)
        return String(self[fromIndex...toIndex])
    }

    func sliceByString(from:String, to:String) -> String? {
        //From - startIndex
        var range = self.range(of: from)
        let subString = String(self[range!.upperBound...])

        //To - endIndex
        range = subString.range(of: to)
        return String(subString[..<range!.lowerBound])
    }

}

Verwendung: "Date(1511508780012+0530)".sliceByString(from: "(", to: "+")

Beispielergebnis : "1511508780012"

PS: Optionale müssen auspacken. Fügen Sie bei Bedarf eine Typprüfung hinzu.

4
byJeevan

Swift4:

extension String {
    func subString(from: Int, to: Int) -> String {
       let startIndex = self.index(self.startIndex, offsetBy: from)
       let endIndex = self.index(self.startIndex, offsetBy: to)
       return String(self[startIndex...endIndex])
    }
}

Verwendungszweck:

var str = "Hello, playground"
print(str.subString(from:1,to:8))
3
August Lin

mit dieser Methode können Sie einen bestimmten String-Bereich abrufen. Sie müssen den Startindex und danach die Gesamtzahl der gewünschten Zeichen übergeben.

extension String{
    func substring(fromIndex : Int,count : Int) -> String{
        let startIndex = self.index(self.startIndex, offsetBy: fromIndex)
        let endIndex = self.index(self.startIndex, offsetBy: fromIndex + count)
        let range = startIndex..<endIndex
        return String(self[range])
    }
}
3

Bei der Programmierung habe ich oft Strings mit einfachem A-Za-z und 0-9. Keine Notwendigkeit für schwierige Indexaktionen. Diese Erweiterung basiert auf den einfachen alten linken/mittleren/rechten Funktionen.

extension String {

    // LEFT
    // Returns the specified number of chars from the left of the string
    // let str = "Hello"
    // print(str.left(3))         // Hel
    func left(_ to: Int) -> String {
        return "\(self[..<self.index(startIndex, offsetBy: to)])"
    }

    // RIGHT
    // Returns the specified number of chars from the right of the string
    // let str = "Hello"
    // print(str.left(3))         // llo
    func right(_ from: Int) -> String {
        return "\(self[self.index(startIndex, offsetBy: self.length-from)...])"
    }

    // MID
    // Returns the specified number of chars from the startpoint of the string
    // let str = "Hello"
    // print(str.left(2,amount: 2))         // ll
    func mid(_ from: Int, amount: Int) -> String {
        let x = "\(self[self.index(startIndex, offsetBy: from)...])"
        return x.left(amount)
    }
}
2
Vincent

Dies ist meine Lösung, keine Warnung, keine Fehler, aber perfekt

let redStr: String = String(trimmStr[String.Index.init(encodedOffset: 0)..<String.Index.init(encodedOffset: 2)])
let greenStr: String = String(trimmStr[String.Index.init(encodedOffset: 3)..<String.Index.init(encodedOffset: 4)])
let blueStr: String = String(trimmStr[String.Index.init(encodedOffset: 5)..<String.Index.init(encodedOffset: 6)])
2
Victor John

Ich hoffe es wäre hilfreich.

extension String {
    func getSubString(_ char: Character) -> String {
        var subString = ""
        for eachChar in self {
            if eachChar == char {
                return subString
            } else {
                subString += String(eachChar)
            }
        }
        return subString
    }
}


let str: String = "Hello, playground"
print(str.getSubString(","))
0
Anand Verma

`var str =" Hallo, Spielplatz "

let indexcut = str.firstIndex (von: ",")

print(String(str[..<indexcut!]))

print(String(str[indexcut!...])) `

Sie können es auf diese Weise versuchen und erhalten die richtigen Ergebnisse

0
user1828845

Hoffe das hilft ein wenig mehr: -

var string = "123456789"

Wenn Sie nach einem bestimmten Index einen Teilstring wünschen.

var indexStart  =  string.index(after: string.startIndex )// you can use any index in place of startIndex
var strIndexStart   = String (string[indexStart...])//23456789

Wenn Sie nach dem Entfernen eines Strings am Ende einen Teilstring wünschen.

var indexEnd  =  string.index(before: string.endIndex)
var strIndexEnd   = String (string[..<indexEnd])//12345678

sie können auch Indizes mit folgendem Code erstellen: -

var  indexWithOffset =  string.index(string.startIndex, offsetBy: 4)
0
Anurag Bhakuni