Как я могу получить n-й символ строки? Я попытался использовать скобку ( []
) без удачи.
var string = "Hello, world!"
var firstChar = string[0] // Throws error
ОШИБКА: «индекс» недоступен: не может подписать строку с Int, см. Комментарий к документации для обсуждения
swift
string
collections
character
Мохсен
источник
источник
var firstChar = string.index(string.startIndex, offsetBy: 0)
вместо этогоstring.startIndex
? Для первого персонажаstring[string.startIndex]
или простоstring.first
. Обратите внимание, что при первом подходе вам необходимо проверить, пуста ли строка, во-первых, второй возвращает необязательныйОтветы:
Внимание: пожалуйста, смотрите ответ Лео Дабуса для правильной реализации Swift 4 и Swift 5.
Swift 4 или позже
Substring
Тип был введен в Swift 4 , чтобы сделать подстроки быстрее и эффективнее, делясь хранения с исходной строки, так это то, что должен возвращать функции подстрочные.Попробуйте это здесь
Чтобы преобразовать
Substring
в aString
, вы можете просто сделатьString(string[0..2])
, но вы должны делать это, только если вы планируете сохранить подстроку вокруг. В противном случае, более эффективно сохранить этоSubstring
.Было бы здорово, если бы кто-нибудь смог найти хороший способ объединить эти два расширения в одно. Я попытался расширитьПримечание. Этот ответ уже отредактирован, правильно реализован и теперь работает и для подстрок. Просто убедитесь, что вы используете правильный диапазон, чтобы избежать сбоев при подписке вашего типа StringProtocol. Для подписки с диапазоном, который не будет падать со значениями вне диапазона, вы можете использовать эту реализациюStringProtocol
без успеха, потому чтоindex
метод там не существует.Почему это не встроено?
Сообщение об ошибке гласит «см. Комментарий к документации для обсуждения» . Apple предоставляет следующее объяснение в файле UnavailableStringAPIs.swift :
источник
Cannot find an overload for 'advance' that accepts an argument list of type '(String.Index, T)'
...String.Index
иInt
не совместимыCannot subscript a value of type 'String'...
проверьте этот ответ: stackoverflow.com/a/31265316/649379Ambiguous use of 'subscript'
.fatal error: Can't form a Character from an empty String
Swift 5.2
Вам нужно будет добавить это расширение String в ваш проект (он полностью протестирован):
Хотя у Swift всегда было готовое решение этой проблемы (без расширения String, которое я предоставил ниже), я все равно настоятельно рекомендую использовать расширение. Почему? Потому что это сэкономило мне десятки часов мучительного перехода от ранних версий Swift, где синтаксис String менялся почти в каждом выпуске, но все, что мне нужно было сделать, это обновить реализацию расширения, а не рефакторинг всего проекта. Сделай свой выбор.
источник
range.upperBound - range.lowerBound
наrange.count
extension StringProtocol where Self: RangeReplaceableCollection { subscript(offset: Int) -> Element { get { return self[index(startIndex, offsetBy: offset)] } set { let start = index(startIndex, offsetBy: offset) replaceSubrange(start..<index(after: start), with: [newValue]) } } }
Я только что придумал этот аккуратный обходной путь
источник
var firstChar = Array(string!)[0]
противном случае он скажетadd arrayLiteral
Нет индексации с использованием целых чисел, только с помощью
String.Index
. В основном с линейной сложностью. Вы также можете создавать диапазоныString.Index
и получать подстроки, используя их.Swift 3.0
Swift 2.x
Обратите внимание, что вы никогда не сможете использовать индекс (или диапазон), созданный из одной строки в другую строку
источник
String
индексы уникальны для строки. Это связано с тем, что разные строки могут иметь разные UTF-16 с несколькими единицамиCharacters
и / или в разных позициях, поэтому индексы единиц UTF-16 не будут совпадать, могут выходить за пределы конца или точки внутри UTF-16 с несколькими единицамиCharacter
...
сейчас..<
(в вашем назначенииrange
)var lastChar = string[string.endIndex.predecessor()]
Xcode 11 • Swift 5.1
Вы можете расширить StringProtocol, чтобы сделать индекс доступным также для подстрок:
тестирование
источник
return String(Array(characters)[range])
Swift 3?Swift 4
Строка в индексе
Substring
Первые n символов
Последние n символов
Свифт 2 и 3
** Строка в индексе **
Swift 2
Свифт 3
Подстрока из индекса в индекс
Swift 2
Свифт 3
Первые n символов
Последние n символов
источник
Swift 2.0 от Xcode 7 GM Seed
Для n-го символа замените 0 на n-1.
Редактировать: Swift 3.0
NB Есть более простые способы получения определенных символов в строке
например
let firstChar = text.characters.first
источник
Если вы видите,
Cannot subscript a value of type 'String'...
используйте это расширение:Свифт 3
Swift 2.3
Источник: http://oleb.net/blog/2014/07/swift-strings/
источник
Решение Swift 2.2:
Следующее расширение работает в Xcode 7, это комбинация этого решения и преобразования синтаксиса Swift 2.0.
источник
Класс быстрой строки не предоставляет возможности получить символ по определенному индексу из-за его собственной поддержки символов UTF. Переменная длина символа UTF в памяти делает невозможным переход непосредственно к символу. Это означает, что вы должны вручную зацикливать строку каждый раз.
Вы можете расширить String, чтобы обеспечить метод, который будет циклически проходить символы до нужного вам индекса
источник
myString.bridgeToObjectiveC().characterAtIndex(0)
или(string as NSString ).characterAtIndex(0)
возвращает значение Int для символаNSString
методы для доступа к отдельным символам из Swift-nativeString
- оба используют разные механизмы подсчета, поэтому вы получите непредсказуемые результаты с более высокими символами Unicode. Первый метод должен быть безопасным (после обработки ошибок Юникода в Swift).Как примечание, есть несколько функций, применимых непосредственно к символьно-цепочечному представлению строки, например:
Результат имеет тип Character, но вы можете привести его к String.
Или это:
:-)
источник
Swift 4
Это, вероятно, лучший способ решения этой проблемы за один раз. Вы, вероятно, хотите сначала привести String как массив, а затем снова привести результат как String. В противном случае, символ будет возвращен вместо строки.
Пример
String(Array("HelloThere")[1])
вернет «е» в виде строки.(Array("HelloThere")[1]
вернет «е» как символ.Swift не позволяет индексировать строки как массивы, но это делает работу в стиле грубой силы.
источник
Мое очень простое решение:
Swift 4.1:
Swift 5.1:
источник
let flags = "🇺🇸🇧🇷"
flags[String.Index(utf16Offset: 4, in: flags)] // "🇧🇷"
Вы можете сделать это, преобразовав String в Array и получить его по определенному индексу, используя нижний индекс, как показано ниже
источник
У меня просто была такая же проблема. Просто сделайте это:
источник
NSString
.Swift3
Вы можете использовать синтаксис нижнего индекса для доступа к символу по определенному строковому индексу.
Посещение https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html
или мы можем сделать расширение строки в Swift 4
ПРИМЕНЕНИЕ:
источник
Мое решение в одной строке, предполагая, что кадена - это строка, а 4 - это n-я позиция, которую вы хотите:
Просто ... Я предполагаю, что Swift будет включать больше вещей о подстрок в будущих версиях.
источник
var charAtIndex = string[advance(string.startIndex, 10)]
в ответе Султана?Swift 3: другое решение (проверено на детской площадке)
Применение:
источник
Обновление для подстроки swift 2.0
источник
Я думаю, что быстрый ответ для получения первого символа может быть:
Это намного элегантнее и эффективнее, чем:
Но ... если вы хотите манипулировать и выполнять больше операций со строками, вы можете подумать, что создаете расширение ... с таким подходом есть одно расширение, оно очень похоже на уже опубликованное здесь:
}
Но это ужасная идея!
Расширение ниже ужасно неэффективно. Каждый раз, когда к строке обращаются с помощью целого числа, запускается функция O (n) для продвижения ее начального индекса. Запуск линейного цикла внутри другого линейного цикла означает, что этот цикл for случайно равен O (n2) - при увеличении длины строки время, которое занимает этот цикл, увеличивается квадратично.
Вместо этого вы можете использовать коллекцию строк символов.
источник
Свифт 3
Применение
Полезные советы по программированию (написано мной)
источник
Получить и установить индекс (строка и подстрока) - Swift 4.2
Swift 4.2, Xcode 10
Я основал свой ответ на ответе @alecarlson . Единственная большая разница в том, что вы можете получить
Substring
илиString
вернуть (и в некоторых случаях, одинCharacter
). Можно такжеget
иset
подстрочный. Наконец, мой немного более громоздкий и более длинный, чем ответ @alecarlson , и поэтому я предлагаю вам поместить его в исходный файл.Расширение:
источник
Swift 4.2
Этот ответ идеален, потому что он распространяется
String
и все егоSubsequences
(Substring
) в одном расширенииПрименение
источник
start
иend
) изstartIndex
. Вы можете простоend
сместить индекс с помощью range.count и сместитьstart
индексВ настоящее время индекс (_ :) недоступен. Как и мы не можем сделать это
со строкой. Мы должны предоставить «String.Index». Но как мы можем таким образом указать свой собственный индекс, вместо этого мы можем использовать
источник
string[string.startIndex]
? Кстати, код будет некорректно вести себя / компилироваться, так как вы использовали два разных имени переменных.Swift 4.2 или позже
Диапазон и частичный диапазон индексирование , используя
String
«sindices
свойствоКак вариант хорошего ответа @LeoDabus , мы можем добавить дополнительное расширение, чтобы
DefaultIndices
позволить нам использоватьindices
свойствоString
при реализации пользовательских подписок (поInt
специальным диапазонам и частичным диапазонам) для последнего.Спасибо @LeoDabus за указание на то, как использовать это
indices
свойство как (другую) альтернативуString
подписке!источник
swiftenv
когда я делаю, хотя, я думаю, он будет обновлен с 4.2 также несколько позже.Swift 5.1.3:
Добавьте расширение String:
источник
String
Тип Swift не обеспечиваетcharacterAtIndex
метод, поскольку существует несколько способов кодирования строки Unicode. Собираетесь ли вы с UTF8, UTF16 или чем-то еще?Вы можете получить доступ к
CodeUnit
коллекции путем извлеченияString.utf8
иString.utf16
свойств. Вы также можете получить доступ кUnicodeScalar
коллекции, получивString.unicodeScalars
свойство.В духе
NSString
российской реализации я возвращаюunichar
тип.источник
Для того, чтобы подать тему и показать возможности быстрого индекса, вот небольшая строка «substring-toolbox» на основе индекса
Эти методы безопасны и никогда не перебирают строковые индексы
источник
Python-подобное решение, которое позволяет использовать отрицательный индекс,
может быть:
Кстати, может быть, стоит перенести нотацию всего питона
источник
Вы также можете конвертировать строку в массив символов, например:
Это способ получить символ по указанному индексу в постоянное время.
Пример ниже не работает в постоянном времени, но требует линейного времени. Так что если у вас есть много поиска в строке по индексу, используйте метод выше.
источник