Как всегда, когда выходит новая версия Swift, я читаю руководство и задаю вопросы для повторения. Итак, приступим к работе со строками. Как вы знаете, строки снова являются типами коллекций, поэтому больше нет символов .characters, за что мы все можем быть благодарны.

Как создать многострочную строку?

Использование тройной кавычки

let x = """
        he said she said
        and then more
        and then still more
        """

Заметьте, зеленый новобранец, что тройная кавычка НИЖНЯЯ определяет, где начинается отступ. Вы можете добавить отступы, вы можете добавить \, чтобы соединить строку вместе.

Когда вы получаете подстроку из строки, какого она типа? Нить?

Нет, нежная душа, это не Струна. Это подстрока.

Какой протокол используют String и Substring?

Они используют StringProtocol.

Ой! Не поэтому ли типы обработки строк так часто принимают типы StringProtocol в качестве входных данных?

Как вы говорите. Ты мудрее, чем кажешься.

Так приятно знать, что копирование по умолчанию гарантирует, что String, как подлинный тип значения 14 karat, ВСЕГДА копируется за кулисами.

Вы видели, что я там делал? Это не всегда копируется за кулисами. Он часто передается по ссылке, и копирование выполняется только в том случае, если вы собираетесь изменить строку. Вы получаете много прироста производительности из-за этого злого маленького трюка. Ловкость рук, если хотите. Немного старомодного трехкарточного монте.

Почему это зло?

Это не совсем зло.

Ничего себе, вы можете добавить символ в строку! Просто используйте +, как вы, чтобы сделать конкатенацию?

Нет, это было бы слишком очевидно. Вы должны использовать

aString.append(“C”)

метод.

Что такое интерперколяция струн?

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

Можете ли вы создать строку из массива символов?

Вы, конечно, можете, милые щечки. Просто бросьте эту присоску в String и вуаля.

Ты оскорбляешь меня?

Хотите, чтобы я? Хочешь, я поставлю триггер-предупреждение, чтобы у тебя не появилась сыпь или что-то в этом роде?

У тебя очень плохие манеры.

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

Что такое расширенный графемный кластер?

Хорошо, ты справился с *этим*. Это последовательность из одного или нескольких символов Юникода, в результате которой получается один, то есть один и только один, удобочитаемый символ.

Итак, я перебираю каждый скаляр Unicode, чтобы подсчитать удобочитаемые символы в строке?

Ну вроде. У ВАС нет, а у свойства .count — есть.

Итак, count возвращает количество скаляров Unicode?

НЕТ. Он возвращает количество удобочитаемых значений, но для этого он должен прочитать каждый благословенный скаляр в строке, так что ДУМАЙТЕ, прежде чем использовать его, хорошо? Используйте свою голову для чего-нибудь, кроме шляпного трека.

Какое облегчение знать, что String.count всегда == [длина NSString]

Только в твоих снах, душистый горошек. Я могу придумать другие формы помощи, более быстрые и эффективные. Длина NSString не учитывает удобочитаемые значения, она учитывает 16-битные кодовые единицы в строковом представлении UTF 16.

Боже мой, как тебе удается быть такой противной?

Кто сказал, что мне это сойдет с рук?

Ну, по крайней мере, .index не нужно считывать каждый скаляр Unicode в строке?

Вы действительно живете в своей собственной маленькой вселенной, не так ли? А ты не слушай. Индекс также должен перебирать каждый скаляр Unicode в строке.

И даже в этом случае вы все еще можете использовать целые значения в качестве индексов в String! Это чудесно!

НЕТ, ВЫ НЕ МОЖЕТЕ. Индекс не преобразуется в физическую позицию в массиве. Нет целых чисел.

Итак, startIndex получает первую позицию в строке?

Оно делает. Я вижу, как твоя ошибка едет на меня, как грузовик. Вот оно.

Итак, endIndex получает последнюю позицию в строке?

А ты скосил бабушку, которая как раз тихонько пыталась перейти дорогу к чему-то у фруктового ларька. НЕТ. endIndex получает позицию ПОСЛЕ последнего символа в строке.

Вот идиома для получения последнего символа в строке.

пусть i2 = message.index (до: message.endIndex)

Ужасно спортивно с твоей стороны!

О, разве это НЕ ТОЛЬКО? Давайте устроим хайбол на Уимблдоне в следующем сезоне. Я поищу тебя.

Если строка пуста, что происходит с startIndex и endIndex?

Наконец-то они обрели мечту о братстве и истинном равенстве. Они равны.

Помните до:, после: и offsetBy: при использовании Index. Они твои друзья, если ты можешь иметь друзей.

Так как String теперь коллекция, ну, скажем так, наводит на определенные мысли, даже трепет!

О, это так, это так! Вы можете использовать before, after и offsetBy для любого типа коллекции, например Array, Set или Dictionary.

Как вы вставляете и удаляете элементы в строке?

Как вы говорите. Вы используете вставку и удаление. Если вы вставляете символ, просто передайте его. Если вы вставляете строку, вы должны использовать метку contentOf:.

Просто чтобы убедиться, что две строки являются братьями от другой матери, как вы можете проверить их полное равенство как строки?

Куа? Похвастаться школьной латынью? Позер. Вы можете протестировать, как и ожидалось, с помощью == и !=.

Канамагонически эквивалентен. Это одна из моих любимых фраз, но я не знаю, что она означает?

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

Как я могу быстро проверить начало и конец строк на наличие других строк?

Если бы я был тобой, я бы просто спросил кого-нибудь. Но если вы действительно чувствуете, что вам нужно использовать Swift, вы можете использовать hasPrefix и hasSuffix. Я не сомневаюсь, что вы добьётесь бешеного успеха.

Я не могу получить доступ к базовому Unicode?

В вашем случае это скорее случай «я бы не стал» или «кто-то должен вас остановить». Я не могу представить, что вы хотели бы сделать с этим, что было в ваших силах. Впрочем, если просто не удержаться, можно воспользоваться свойствами utf8, utf16 и utfScalars. Последний возвращает 21-битную единицу, эквивалентную UTF32. Этого будет достаточно, чтобы вы попали в неприятности, из которых вы, вероятно, не выберетесь. Но самое приятное, что вы, вероятно, никогда не узнаете об этом.

Что вы скажете рекрутеру, когда он с гордостью скажет вам, что ищет страстную рок-звезду?

Я не могу печатать то, что говорю им здесь. НЕ БЬИТЕ ИХ, это доставит вам неприятности. Скажите им: это работа. Это не требует страсти. Это требует компетентности, проницательности, интеллекта, дисциплины, уверенности и способностей. Страсть — это то, что вам нужно, если вы не очень хороши и хотите, чтобы люди этого не замечали.