Пол Хадсон опубликовал замечательную книгу под названием Проблемы быстрого кодирования, которую я настоятельно рекомендую вам купить и изучить.
Но вернемся к вопросу. Пол сказал:
Это один из самых распространенных вопросов, с которыми вы столкнетесь на собеседовании, и у него есть особая особенность Swift, которая могла вас зацепить: строки могут выглядеть как массивы, но пытаться индексировать их сложно.
Итак, действительно ли сложно индексировать String?
Предпочтительно, учитывая строку, я хотел бы получить доступ к символу с индексом 5, как это, и изменить i-й символ строки другим, используяInt
:
var input = "My name is Ahmed" let char = input[5] input[11] = "M"
Поскольку Swift 2,String
больше не соответствуетSequenceType.
Другими словами, вы не можете перебирать строку с помощью цикла for
...in
.
Если вы попытаетесь это сделать. Компилятор выдаст следующую ошибку:
‘subscript(_:)’ недоступен: нельзя индексировать String с помощью Int, вместо этого используйте String.Index.
Я помню, как пытался проиндексировать строку без переноса строки в инициализатор массива. Я был очень расстроен тем, что не смог придумать или достичь желаемого результата, и был готов сдаться.
Поэтому я решил создать собственное обходное решение, позволяющее избавиться от конструктора массива. Написав несколько строк кода, вы можете легко получить доступ к символу в строке, используя заданный индекс.
Есть два способа добавить символ в определенный индекс в строке или заменить символ другим символом.
- Во-первых, если вам нужно добавитьсимвол по определенному индексу в строке. Создав
extension
кString
вы можете сделатьsubscript
иget
иset
индекс.
Вот полный код расширения:
Inget
, чтобы преобразовать подстроку в строку, вы можете просто обернуть свою подстроку в инициализатор aString
следующим образом:
String(self[self.index(startIndex, offsetBy: index)])
Вset
вам нужно проверить, равен ли индекс количеству символов в строке или превышает его. Если это правда, вы должны добавить символ в последний индекс строки; в противном случае вы вставляете новый символ (bynewValue
), который хотите добавить в определенный индекс.
Который можно использовать так же, как мы изначально хотели:
2. Во-вторых, если вы хотите заменить символ другим символом. Создав это расширение и внедрив методsubscript
, мы можем реализовать эту функциональность в каждой строке.
Вот полный код расширения:
Вset
вам сначала нужноremove
символ, который вы хотите изменить, и insert
новый символ, который вы хотите добавить с тем же индексом.
Который также можно использовать так же, как мы изначально хотели:
Используя приведенный выше код в своем проекте, вы можете получить символ из строки, используя его индекс, а не загромождать свой код преобразованием строки в массив или использовать самый длинный способ найти символ, который:let char = input[input.index(input.startIndex, offsetBy: 5)]
И это все. Теперь Мы можем выполнять свои задачи, индексируя в строку, и никакая конвертация вас не огорчает😉.
Это простой и полезный способ использования и прохождения модели доступа Swift String.
Теперь, когда вы почувствуете, что в следующий раз все будет гладко, когда вы сможете перебрать строку так, как она есть, без необходимости оборачивать строку в массив.
Попробуйте и посмотрите, поможет ли это!
Пожалуйста, поделитесь этим с друзьями. Если вам нравится то, что вы читаете, и вы считаете, что это было полезно, нажмите кнопку ❤ ниже.