Пол Хадсон опубликовал замечательную книгу под названием Проблемы быстрого кодирования, которую я настоятельно рекомендую вам купить и изучить.

Но вернемся к вопросу. Пол сказал:

Это один из самых распространенных вопросов, с которыми вы столкнетесь на собеседовании, и у него есть особая особенность 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.

Я помню, как пытался проиндексировать строку без переноса строки в инициализатор массива. Я был очень расстроен тем, что не смог придумать или достичь желаемого результата, и был готов сдаться.

Поэтому я решил создать собственное обходное решение, позволяющее избавиться от конструктора массива. Написав несколько строк кода, вы можете легко получить доступ к символу в строке, используя заданный индекс.

Есть два способа добавить символ в определенный индекс в строке или заменить символ другим символом.

  1. Во-первых, если вам нужно добавитьсимвол по определенному индексу в строке. Создав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.

Теперь, когда вы почувствуете, что в следующий раз все будет гладко, когда вы сможете перебрать строку так, как она есть, без необходимости оборачивать строку в массив.

Попробуйте и посмотрите, поможет ли это!

Пожалуйста, поделитесь этим с друзьями. Если вам нравится то, что вы читаете, и вы считаете, что это было полезно, нажмите кнопку ❤ ниже.