Пришло время признать свое поражение ...
В Objective-C я мог бы использовать что-то вроде:
NSString* str = @"abcdefghi";
[str rangeOfString:@"c"].location; // 2
В Swift я вижу нечто подобное:
var str = "abcdefghi"
str.rangeOfString("c").startIndex
... но это просто дает мне String.Index
, который я могу использовать, чтобы вставить обратно в исходную строку, но не извлекать местоположение из.
FWIW, у которого String.Index
есть частный ivar, _position
который имеет правильное значение. Я просто не вижу, как это разоблачено.
Я знаю, что мог бы легко добавить это в String сам. Мне больше интересно, что мне не хватает в этом новом API.
Ответы:
Вы не единственный, кто не может найти решение.
String
не реализуетRandomAccessIndexType
. Вероятно, потому что они позволяют символы с различной длиной байта. Вот почему мы должны использоватьstring.characters.count
(count
илиcountElements
в Swift 1.x), чтобы получить количество символов. Это также относится к позициям._position
, Вероятно , индекс в сырой массив байтов , и они не хотят подвергать это. ОнString.Index
предназначен для защиты нас от доступа к байтам в середине символов.Это означает, что любой индекс, который вы получаете, должен быть создан из
String.startIndex
илиString.endIndex
(String.Index
реализуетBidirectionalIndexType
). Любые другие индексы могут быть созданы с помощьюsuccessor
илиpredecessor
методов.Теперь, чтобы помочь нам с индексами, есть набор методов (функции в Swift 1.x):
Swift 4.x
Swift 3.0
Swift 2.x
Swift 1.x
Работать с
String.Index
неудобно, но использование оболочки для индексации целыми числами (см. Https://stackoverflow.com/a/25152652/669586 ) опасно, поскольку скрывает неэффективность реальной индексации.Обратите внимание, что реализация индексации Swift имеет проблему, заключающуюся в том, что индексы / диапазоны, созданные для одной строки, нельзя надежно использовать для другой строки , например:
Swift 2.x
Swift 1.x
источник
range
вvar range = text.rangeOfString("b")
Collection
имеетtypealias IndexType
. Для массивов это определяется какInt
, посколькуString
оно определяется какString.Index
. И массивы, и строки могут также использовать диапазоны (для создания подмассивов и подстрок). Ассортимент представляет собой особый типRange<T>
. Для строк этоRange<String.Index>
для массивовRange<Int>
.Swift 2.0
,distance(text.startIndex, range.startIndex)
становитсяtext.startIndex.distanceTo(range.startIndex)
String
, так же, какNSString
в Foundation, есть метод, который называетсяhasPrefix(_:)
.Swift 3.0 делает это немного более многословным:
Расширение:
В Swift 2.0 это стало проще:
Расширение:
Реализация Swift 1.x:
Для чистого решения Swift можно использовать:
Как расширение для
String
:источник
источник
Я нашел это решение для swift2:
источник
Swift 5.0
Swift 4.0
источник
Я не уверен, как извлечь позицию из String.Index, но если вы хотите использовать некоторые Objective-C-фреймворки, вы можете перейти к target-c и сделать это так же, как раньше.
Кажется, что некоторые методы NSString еще не были (или, возможно, не будут) перенесены в String. Содержит и приходит на ум.
источник
bridgeToObjectiveC()
вызов не требуется. Кажется, моя проблема проявляется только при вызовеrangeOfString
ранее существующей строки Swift. Похоже, проблема с API ...Вот чистое расширение String, которое отвечает на вопрос:
Свифт 3:
Swift 2.2:
источник
Вы также можете найти индексы символа в одной строке, как это,
Который дает результат в [String.Distance] т.е. [Int], как
источник
Если вы хотите использовать знакомый NSString, вы можете объявить его явно:
Я еще не уверен, как это сделать в Swift.
источник
Если вы хотите знать позицию в виде символа в строке в качестве ИНТ использовать значение этого:
источник
value of type 'Range<String.Index>?' has no member 'location'
.Я знаю, что это старый и ответ принят, но вы можете найти индекс строки в нескольких строках кода, используя:
Некоторая другая отличная информация о строках Swift здесь Strings in Swift
источник
find
недоступно в Swift 3Это сработало для меня,
это тоже сработало,
источник
var str = "abcdef"; str.rangeOfString("c").location
выдает ошибку о том, что String.Index не имеет члена с именем location ...Тип переменной String в Swift содержит разные функции по сравнению с NSString в Objective-C. И, как упомянул Султан,
Что вы можете сделать, так это уменьшить значение переменной типа String до NSString (это действительно в Swift). Это даст вам доступ к функциям в NSString.
источник
Если вы думаете об этом, вам на самом деле не нужна точная версия Int для этого местоположения. Range или даже String.Index достаточно, чтобы при необходимости снова вывести подстроку:
источник
Самый простой способ это:
В Swift 3 :
источник
String - это тип моста для NSString, поэтому добавьте
в свой файл swift и используйте все «старые» методы.
источник
С точки зрения мышления это можно назвать ИНВЕРСИЕЙ. Вы обнаружите, что мир круглый, а не плоский. «Вам не нужно знать ИНДЕКС персонажа, чтобы что-то с ним делать». И как программист на Си, мне было трудно это воспринимать! Ваша строка "let index = letters.characters.indexOf (" c ")!" достаточно само по себе. Например, чтобы удалить c, вы можете использовать ... (вставить игровую площадку)
Однако, если вам нужен индекс, вам нужно вернуть фактический INDEX, а не Int, поскольку значение Int потребует дополнительных шагов для любого практического использования. Эти расширения возвращают индекс, число определенных символов и диапазон, который будет демонстрировать этот код подключаемого модуля детской площадки.
источник
Swift 4 Полное решение:
OffsetIndexableCollection (строка, использующая Int Index)
https://github.com/frogcjn/OffsetIndexableCollection-String-Int-Indexable-
источник
String Extension {
}
источник
Swift 5
Найти индекс подстроки
Найти индекс персонажа
источник
Если вы ищете простой способ получить указатель символов или строк, воспользуйтесь этой библиотекой http://www.dollarswift.org/#indexof-char-character-int
Вы можете получить indexOf из строки, используя также другую строку или шаблон регулярных выражений
источник
Чтобы получить индекс подстроки в строке с помощью Swift 2:
источник
В Swift 2.0
источник
источник
Я играю со следующими
пока я не пойму предоставленное, теперь это просто массив символов
и с
источник
Если вам нужен только индекс символа, самое простое и быстрое решение (как уже указывалось Паскалем):
источник
На предмет превращения
String.Index
вInt
, это расширение работает для меня:Пример использования, относящийся к этому вопросу:
Важный:
Как вы можете сказать, он группирует расширенные кластеры графем и присоединяемые символы иначе, чем
String.Index
. Конечно, именно поэтому мы имеемString.Index
. Следует помнить, что этот метод рассматривает кластеры как единичные символы, что ближе к правильному. Если ваша цель состоит в том, чтобы разбить строку по коду Unicode, это не решение для вас.источник
В Swift 2.0 следующая функция возвращает подстроку перед заданным символом.
источник
Вы можете найти номер индекса символа в строке с помощью этого:
источник
Как моя точка зрения, лучший способ узнать саму логику ниже
источник