ostrzeżenie: „znaki” są przestarzałe: użyj bezpośrednio ciągu lub podłańcucha

162

znaków - właściwość instancji String, jest przestarzała z Xcode 9.1

Bardzo przydatne było pobranie podciągu z String za pomocą characterswłaściwości, ale teraz jest on przestarzały, a Xcode sugeruje użycie substring. Próbowałem sprawdzić pytania SO i samouczki / wytyczne dla programistów Apple. Ale nie widziałem żadnego rozwiązania / alternatywy zgodnie z sugestią.

Oto komunikat ostrzegawczy:

„Znaki” są przestarzałe: użyj ciągu lub podłańcucha

wprowadź opis obrazu tutaj

Mam tak wiele operacji na łańcuchach, które są wykonywane / obsługiwane za pomocą właściwości characters.

Czy ktoś ma pomysł / informacje o tej aktualizacji?

Krunal
źródło
5
Oto interesujący artykuł o Stringzmianach z Swift 3 na 4 i przeczytaj również SE0163
vadian
5
spróbuj użyć countzamiast tego.
holex
1
Jesli uzywasz string.characters.forEachnowego APIstring.forEach { char in process(char) }
Efren

Odpowiedzi:

270

Swift 4 wprowadził zmiany w string API.
Możesz po prostu użyć !stringValue.isEmptyzamiaststringValue.characters.count > 0

aby uzyskać więcej informacji, pobierz próbkę stąd

np

let edit = "Summary"
edit.count   // 7
songxunzhao
źródło
Dziękuję za odpowiedź. Ale czy mogę uzyskać szczegółowe odniesienie do łańcucha podrzędnego. To tylko przykładowy przykład, mam tak wiele innych operacji związanych z postaciami
Krunal
1
Sprawdź szczegółowe informacje tutaj. developer.apple.com/library/content/documentation/Swift/…
songxunzhao
let greeting = "Witaj, świecie!" let index = greeting.index (of: ",") ?? greeting.endIndex let
begin
1
Dokumentacja online dla podłańcucha .
Dennis Vennink
32
Nigdy nie używaj count> 0, aby sprawdzić, czy kolekcja jest pusta. W kolekcji znajduje się właściwość o nazwie isEmpty. Z dokumentów Gdy chcesz sprawdzić, czy kolekcja jest pusta, użyj właściwości isEmpty zamiast sprawdzania, czy właściwość count jest równa zero. W przypadku kolekcji, które nie są zgodne z RandomAccessCollection, uzyskiwanie dostępu do właściwości count powoduje iterację przez elementy kolekcji.
Leo Dabus
82

Przykłady wersji Swift 4 i Swift 3:

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
źródło
2
To powinna być akceptowana odpowiedź. Pytanie dotyczy zamiany dla string.characters.count, a nie zastąpienia porównania do zera; wspomniano tylko na zrzucie ekranu.
Timothy Kanski,
9

Jednym z najczęstszych przypadków manipulowania ciągami są odpowiedzi JSON. W tym przykładzie utworzyłem rozszerzenie w mojej aplikacji zegarka, aby porzucić ostatnie (n) znaki obiektu Bitcoin JSON.

Swift 3:

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

Komunikat o błędzie Xcode 9.1:

„Znaki” są przestarzałe: użyj bezpośrednio ciągu lub podłańcucha

Xcode mówi nam użyć zmiennej ciąg lub metody bezpośrednio .

Swift 4:

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

Kompletne rozszerzenie:

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

    var dropLast: String {
        return dropLast()
    }
}

Połączenie:

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

Konsola:

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

Dodatkowe przykłady:

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

Dokumentacja:

Często będziesz używać typowych metod, takich jak dropLast()lub removeLast()lubcount tak jest tu wyraźny dokumentacji firmy Apple dla każdej metody.

droplast ()

removelast ()

liczenie znaków

Edison
źródło
2

To ostrzeżenie to tylko wierzchołek góry lodowej, był łup zmian w ciągach znaków, ciągi znaków są znowu zbiorem znaków, ale mamy coś nowego i fajnego, subStrings :)

To świetna lektura na ten temat: https://useyourloaf.com/blog/updating-strings-for-swift-4/

Boris
źródło
2

Użyj tego, charactersponieważ Stringprzestał być kolekcją w Swift 2.0. Jednak jest to nadal ważny kod w Swift 4, ale nie jest już potrzebny, ponieważ Stringjest to plikCollection ponownie.

Na przykład Swift 4 Stringma teraz bezpośrednią właściwość count, która podaje liczbę znaków:

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

Przykłady dla String i SubString.

Strunowy

Swift 4 Stringteraz bezpośrednio pobiera Element, który daje pierwszy znak String:(string.characters.first)

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

SubString

Za pomocą SubString pobierz pierwszy znak.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Pranavan Sp
źródło
Chcę uzyskać pierwszy znak ciągu, więc chcę wiedzieć, w jaki sposób powinienem użyć let firstElement = spString.first czy Substring?
Pulkit
1
@Pulkit Lepiej używać, .firstponieważ ciąg jest ""pusty. zwróci tylko nil, ale substringspowoduje błąd.
Pranavan Sp,
jak przekonwertować ten wiersz kodu na swift 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]). capitalized'
Pulkit
@Pulkit po prostu usuń .characterswystarczająco dużo
Pranavan Sp
0

Możesz także użyć tego kodu do grupowania słowników bez używania {$ 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
źródło
0

Po prostu usuń znaki Na przykład:

stringValue.characters.count to stringValue.count

Ayoub Bouya
źródło