Выдержка из документации 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()
напрямую для доступа к подстроке.
Поскольку это может быть не индекс для предоставленного символа, поэтому, следуя вашему пути, приложение выйдет из строя
func firstIndex(of element: Character) -> String.Index?
Дополнительный возврат String.Index?
решает эту проблему, и зачем вам это нужно ??
если вы не поставляете ??
Затем вам нужно принудительно развернуть let beginning = greeting[..<index]
, здесь индекс должен быть index!
, что приведет к сбою, если он равен нулю.
@RakeshaShastri да, это причина
Да, я говорю, что это правильный ответ. Почему он должен выдавать ошибку? Он может просто вернуть nil
? Почему ?? greeting.endIndex
обязателен, как он говорит?
Хорошо, плохо. Ошибка возвращается в следующей строке. упс, что имеет смысл.
Рассмотрим этот пример.
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 validIndex
, 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 validIndex
, so yourindex
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 Я отредактировал свой ответ, который должен помочь вам лучше понять проблему. :)
Спасибо! Я выучил по желанию. Обновленный ответ имеет большой смысл.
После того, как вы узнали, что такое необязательный параметр, вы можете проверить, как безопасно развернуть его с помощью guard
и if let
. Также не всегда необходимо проводить нулевое слияние. Вы можете использовать переменную как необязательную, потому что иногда вы обрабатываете случай nil
вместе с действительными случаями.
Индекс явно необязательный, поэтому он может возвращать
nil
, что, как я думаю, делает?