Warnung: 'Zeichen' ist veraltet: Bitte verwenden Sie String oder Teilzeichenfolge direkt

162

Zeichen - Eine Instanzeigenschaft von String, die mit Xcode 9.1 nicht mehr unterstützt wird

Es war sehr nützlich, mithilfe der charactersEigenschaft einen Teilstring aus String abzurufen, aber jetzt ist er veraltet und Xcode schlägt vor, ihn zu verwenden substring. Ich habe versucht, SO-Fragen und Tutorials / Richtlinien für Apple-Entwickler zu überprüfen. Konnte aber keine Lösung / Alternative wie vorgeschlagen sehen.

Hier ist eine Warnmeldung:

'Zeichen' ist veraltet: Bitte verwenden Sie String oder Teilzeichenfolge

Geben Sie hier die Bildbeschreibung ein

Ich habe so viele String-Operationen mit Eigenschaften ausgeführt / behandelt characters.

Hat jemand eine Idee / Info zu diesem Update?

Krunal
quelle
5
Hier ist ein interessanter Artikel über die StringÄnderungen von Swift 3 zu 4 und bitte lesen Sie auch SE0163
Vadian
5
versuchen Sie countstattdessen zu verwenden .
Holex
1
Wenn Sie string.characters.forEachdie neue API verwendet haben, iststring.forEach { char in process(char) }
Efren

Antworten:

270

Swift 4 führte Änderungen an der String-API ein.
Sie können einfach !stringValue.isEmptyanstelle von verwendenstringValue.characters.count > 0

Für weitere Informationen erhalten Sie das Beispiel hier

für zB

let edit = "Summary"
edit.count   // 7
songxunzhao
quelle
Vielen Dank für Ihre Antwort. Aber kann ich eine detaillierte Referenz der Unterzeichenfolge haben? Dies ist nur ein Beispiel, ich habe so viele andere Operationen, die sich mit Charakteren befassen
Krunal
1
Bitte überprüfen Sie die Detailinformationen von hier. developer.apple.com/library/content/documentation/Swift/…
songxunzhao
let greeting = "Hallo Welt!" let index = greeting.index (von: ",") ?? greeting.endIndex let begin = greeting [.. <index]
begin
1
Online-Referenz für Teilzeichenfolge .
Dennis Vennink
32
Verwenden Sie niemals count> 0, um zu überprüfen, ob eine Sammlung leer ist. Genau dafür gibt es in Collection eine Eigenschaft namens isEmpty. Aus den Dokumenten Wenn Sie überprüfen müssen, ob Ihre Sammlung leer ist, verwenden Sie die Eigenschaft isEmpty, anstatt zu überprüfen, ob die Eigenschaft count gleich Null ist. Bei Sammlungen, die nicht mit RandomAccessCollection übereinstimmen, werden beim Zugriff auf die count-Eigenschaft die Elemente der Sammlung durchlaufen.
Leo Dabus
82

Swift 4 vs Swift 3 Beispiele:

let myString = "test"

for char in myString.characters {print(char) } // Swift 3
for char in myString { print(char) } // Swift 4

let length = myString.characters.count // Swift 3
let length = myString.count // Swift 4
Mohammad Sadegh Panadgoo
quelle
2
Dies sollte die akzeptierte Antwort sein. Die Frage betrifft den Ersatz für string.characters.count und nicht den Ersatz für den Vergleich mit Null. Das wird nur im Screenshot erwähnt.
Timothy Kanski
9

Einer der häufigsten Fälle für die Bearbeitung von Zeichenfolgen sind JSON-Antworten. In diesem Beispiel habe ich eine Erweiterung in meiner Überwachungs-App erstellt, um die letzten (n) Zeichen eines Bitcoin-JSON-Objekts zu löschen.

Swift 3:

func dropLast(_ n: Int = 0) -> String {
    return String(characters.dropLast(n))

Xcode 9.1 Fehlermeldung:

'Zeichen' ist veraltet: Bitte verwenden Sie String oder Teilzeichenfolge direkt

Xcode fordert uns auf, die Zeichenfolgenvariable oder -methode direkt zu verwenden .

Swift 4:

func dropLast(_ n: Int = 0) -> String {
    return String(dropLast(n))
    }

Komplette Erweiterung:

extension String {
    func dropLast(_ n: Int = 0) -> String {
        return String(dropLast(n))
    }

    var dropLast: String {
        return dropLast()
    }
}

Anruf:

print("rate:\(response.USDRate)")
let literalMarketPrice = response.USDRate.dropLast(2)
print("literal market price: \(literalMarketPrice)")

Konsole:

//rate:7,101.0888 //JSON float
//literal market price: 7,101.08 // JSON string literal

Zusätzliche Beispiele:

  • print("Spell has \(invisibleSpellName.count) characters.")
  • return String(dropLast(n))
  • return String(removeLast(n))

Dokumentation:

Sie werden häufig gängige Methoden wie dropLast()oder removeLast()oder verwendencount so ist hier die explizite Apple - Dokumentation für jede Methode.

Droplast ()

removeelast ()

Zeichen zählen

Edison
quelle
2

Diese Warnung ist nur eine Spitze des Eisbergs, es gab eine Beute von Saitenwechseln, Saiten sind wieder eine Sammlung von Charakteren, aber wir haben so etwas Neues und Cooles, SubStrings :)

Dies ist eine großartige Lektüre dazu: https://useyourloaf.com/blog/updating-strings-for-swift-4/

Boris
quelle
2

Verwenden Sie diese Option, charactersda Stringsie in Swift 2.0 keine Sammlung mehr ist. Dies ist jedoch nach wie vor gültige Code in Swift 4 aber nicht mehr erforderlich ist jetzt , dass StringaCollection wieder.

Zum Beispiel hat ein Swift 4 Stringjetzt eine direkte Zählungseigenschaft, die die Zeichenanzahl angibt:

// Swift 4
let spString = "Stack"
spString.count           // 5

Beispiele für String und SubString.

String

Swift 4 Stringerhält jetzt direkt ein Element, das das erste Zeichen von String gibt:(string.characters.first)

let spString = "Stack"
let firstElement = spString.first   //S

SubString

Mit SubString erhalten Sie das erste Zeichen.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Pranavan Sp. Z oo
quelle
Ich möchte das erste Zeichen einer Zeichenfolge erhalten, damit ich weiß, auf welche Weise let firstElement = spString.first oder Substring verwendet werden soll.
Pulkit
1
@Pulkit Besser zu verwenden, .firstda wenn die Zeichenfolge ""leer ist. es wird nur null zurückgeben, aber substringeinen Fehler erzeugen.
Pranavan Sp
Wie konvertiere ich diese Codezeile in Swift? 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]).
großgeschrieben
@ Pulkit gerade .charactersgenug entfernen
Pranavan Sp
0

Sie können diesen Code auch für die Gruppierung von Wörterbüchern verwenden, ohne {$ 0.characters.first! }.

let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000]
let groupedCities = Dictionary(grouping: cities.keys) { $0.first! }
print(groupedCities)
Mahendra Solanki
quelle
0

Entfernen Sie einfach Zeichen. Zum Beispiel:

stringValue.characters.count bis stringValue.count

Ayoub Bouya
quelle