Всегда ли требуется Nil-Coalescing при использовании firstIndex (of: Character) в Swift?

Выдержка из документации Apple Язык программирования Swift (Swift 4.2).

let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex

let beginning = greeting[..<index]

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

let beginning = greeting[..<greeting.firstIndex(of: ",")]

Если не указывать ?? greeting.endIndex, Xcode возвращает ошибку.

Вопрос в том, зачем это нужно? Почему мы не можем просто использовать firstIndex() напрямую для доступа к подстроке.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
483
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

 func firstIndex(of element: Character) -> String.Index?

Дополнительный возврат String.Index? решает эту проблему, и зачем вам это нужно ??

если вы не поставляете ??

Затем вам нужно принудительно развернуть let beginning = greeting[..<index], здесь индекс должен быть index!, что приведет к сбою, если он равен нулю.

Индекс явно необязательный, поэтому он может возвращать nil, что, как я думаю, делает?

Rakesha Shastri 10.08.2018 13:25

@RakeshaShastri да, это причина

Sh_Khan 10.08.2018 13:27

Да, я говорю, что это правильный ответ. Почему он должен выдавать ошибку? Он может просто вернуть nil? Почему ?? greeting.endIndex обязателен, как он говорит?

Rakesha Shastri 10.08.2018 13:27

Хорошо, плохо. Ошибка возвращается в следующей строке. упс, что имеет смысл.

Rakesha Shastri 10.08.2018 13:28
Ответ принят как подходящий

Рассмотрим этот пример.

let greeting = "Hey There!"
let index = greeting.firstIndex(of: ",")

index относится к типу Index?, поэтому может быть нулевым. Поскольку в строке нет ",", значение индекса равно нулю.

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

let beginning = greeting[..<index]

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

guard let indexFound = index else {
    print("Character not) found in string"
    return
}

let beginning = greeting[..<indexFound]
print("The first occurance of the character is at \(beginning).")

Real world example: (I know it's not good, but it should be enough :x)

Remember the bot captcha's that pop up in websites? The ones that ask you to identify the number of cars, street signs etc. So there you click on the boxes which show the requirement. and click 'submit'. But if there aren't any, you click 'Skip'. So drawing parallels. If you have a valid index, it returns the valid index, otherwise it return nil which is not an valid Index, but it is a valid answer to the question asked. (Is there a ',' inside the string?) The problem here is, the next part. Slicing an array requires you to have a valid Index, so your index currently is an optional which you can change to a valid index by safely unwrapping like my example or having a nil-coalescing check at the time of getting the index.

Вам следует поискать варианты в Swift, чтобы лучше понять.

Спасибо за помощь! Этот пример выходит за рамки моего понимания языка, поскольку я новичок, но это не повредит.

Slick 10.08.2018 13:37

@Slick Я отредактировал свой ответ, который должен помочь вам лучше понять проблему. :)

Rakesha Shastri 10.08.2018 13:45

Спасибо! Я выучил по желанию. Обновленный ответ имеет большой смысл.

Slick 10.08.2018 13:51

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

Rakesha Shastri 10.08.2018 14:05

Другие вопросы по теме