предупреждение: «символы» устарели: используйте напрямую строку или подстроку

162

символы - свойство экземпляра String, не рекомендуется с Xcode 9.1

Было очень полезно получить подстроку из String, используя charactersсвойство, но теперь оно устарело, и Xcode предлагает использовать substring. Я попытался проверить SO вопросы и руководства для разработчиков Apple для того же самого. Но не смог увидеть ни одного решения / альтернативы, как предлагалось

Вот предупреждающее сообщение:

«символы» устарели: используйте строку или подстроку

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

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

У кого-нибудь есть идея / информация об этом обновлении?

Krunal
источник
5
Вот интересная статья об Stringизменениях с Swift 3 на 4 и, пожалуйста, прочитайте также SE0163
vadian
5
попробуйте использовать countвместо.
Holex
1
Если бы вы использовали string.characters.forEachновый APIstring.forEach { char in process(char) }
Efren

Ответы:

270

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

для получения дополнительной информации вы получите образец здесь

например

let edit = "Summary"
edit.count   // 7
songxunzhao
источник
Спасибо за ваш ответ .. Но могу ли я иметь подробную ссылку на подстроку. Это просто пример, у меня так много других операций, связанных с персонажами
Крунал
1
Пожалуйста, проверьте подробную информацию здесь. developer.apple.com/library/content/documentation/Swift/…
songxunzhao
пусть приветствие = "Привет, мир!" let index =reeting.index (of: ",") ?? Поздравление.endIndex пусть начало = приветствие [.. <index]
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) символов объекта JSON Биткойн.

Свифт 3:

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

Xcode 9.1 Сообщение об ошибке:

«Знаки» устарели: используйте напрямую строку или подстроку

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здесь, вот явная документация Apple для каждого метода.

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, получите первый символ.

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W
Pranavan Sp
источник
Я хочу получить первый символ строки, поэтому я хочу знать, каким способом я должен использовать let firstElement = spString.first или Substring?
Pulkit
1
@Pulkit Лучше использовать, .firstпотому что если строка ""пуста. он только вернет ноль, но substringвыдаст ошибку.
Pranavan Sp
как преобразовать эту строку кода в быстрый 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

Ayoub Bouya
источник