попередження: 'символи' застаріли: будь ласка, використовуйте String або Substring безпосередньо


162

символів - властивість екземпляра String, застаріле з Xcode 9.1

Було дуже корисно отримати підрядку з String, використовуючи charactersвластивість, але тепер він застарілий, і Xcode пропонує використовувати substring. Я намагався перевірити питання щодо SO та навчальні посібники / рекомендації для розробників яблук на ті ж самі. Але не вдалося побачити жодного рішення / альтернативного варіанту, як було запропоновано.

Ось попереджувальне повідомлення:

'символи' застарілі: використовуйте рядок або підрядку

введіть тут опис зображення

У мене так багато рядкових операцій виконуються / обробляються за допомогою властивості characters.

Хтось має ідею / інформацію про це оновлення?


5
Ось цікава стаття про Stringзміни від Swift 3 до 4, і прочитайте також SE0163
vadian

5
спробуйте використовувати countзамість цього.
холекс

1
Якщо ви використовували string.characters.forEachновий APIstring.forEach { char in process(char) }
Ефрен

Відповіді:


270

Swift 4 внесла зміни в рядковий API.
Ви можете просто використовувати !stringValue.isEmptyзамість цьогоstringValue.characters.count > 0

для отримання додаткової інформації ви отримуєте зразок звідси

напр

let edit = "Summary"
edit.count   // 7

Дякую за вашу відповідь .. Але чи можу я детально вказати на підрядку. Це лише зразок прикладу, у мене так багато інших операцій з персонажами
Krunal

1
Перевірте детальну інформацію тут. developer.apple.com/library/content/documentation/Swift/…
songxunzhao

нехай вітається = "Привіт, світ!" нехай індекс = вітаю.index (of: ",") ?? привітання.endIndex хай починається = привітання [.. <індекс]
songxunzhao

1
Інтернет-посилання на підрядку .
Денніс Веннінк

32
Ніколи не використовуйте count> 0, щоб перевірити, чи колекція порожня. Для цього є властивість Collection, яка називається isEmpty. Від документів Коли вам потрібно перевірити, чи ваша колекція порожня, використовуйте властивість isEmpty замість того, щоб перевіряти, чи властивість count дорівнює нулю. Для колекцій, які не відповідають RandomAccessCollection, доступ до властивості count повторюється через елементи колекції.
Лев Дабус

82

Приклади Swift 4 - 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

2
Це має бути прийнятою відповіддю. Питання стосується заміни для string.characters.count, а не заміни для порівняння з нулем; це лише згадується на скріншоті.
Тимофій Канський

9

Один з найпоширеніших випадків маніпулювання рядками - це відповіді JSON. У цьому прикладі я створив розширення у своїй програмі годинника, щоб скинути останні (n) символи об’єкта Bitcoin JSON.

Швидкий 3:

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

Повідомлення про помилку Xcode 9.1:

'символи' застарілі: будь ласка, використовуйте String або Substring безпосередньо

Xcode пропонує нам використовувати пряму змінну чи метод безпосередньо .

Швидкий 4:

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

Повне розширення:

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

    var dropLast: String {
        return dropLast()
    }
}

Виклик:

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

Консоль:

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

Додаткові приклади:

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

Документація:

Ви часто будете використовувати загальні методи , такі як dropLast()або removeLast()чи countтак тут явне Яблуко документації для кожного методу.

droplast ()

Removelast ()

підрахунок символів


2

Це попередження - це лише вершина айсберга, відбулося певне зміна рядків, рядки - це знову колекція символів, але у нас з'явилися нові нові та круті підрозділи :)

Про це чудово читайте: https://useyourloaf.com/blog/updating-strings-for-swift-4/


2

Використовуйте це, charactersтому що Stringперестав бути колекцією у Swift 2.0. Однак це все ще дійсний код у Swift 4, але він більше не потрібен, коли Stringце Collectionзнову.

Наприклад, Swift 4 Stringтепер має властивість прямого підрахунку, яке дає кількість символів:

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

Приклади для String і SubString.

Рядок

Swift 4 Stringтепер безпосередньо отримує Element, який дає перший символ String:(string.characters.first)

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

SubString

За допомогою SubString отримати перший символ.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W

Я хочу отримати перший символ рядка, тому я хочу знати, який саме спосіб я повинен використовувати хай firstElement = spString.first або Substring?
Пулкіт

1
@Pulkit Краще використовувати, .firstтому що якщо рядок ""порожній. це поверне лише нуль, але substringпризведе до помилки.
Pranavan Sp

як перетворити цей рядок коду в swift 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]). з великої літери'
Pulkit

@Pulkit просто видаліть .charactersдостатньо
Pranavan Sp

0

Ви також можете використовувати цей код для групування словників без використання {$ 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)

0

Просто видаліть символи Наприклад:

stringValue.characters.count до stringValue.count

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.