Почему мне нужно разворачивать oneString
в то время как я прямо сказал, что это будет не ноль, когда я это объявлю?
Вы неправильно поняли, что такое var oneString: String!
. Это не значит, что oneString
не будет ник. Если вы объявите тип var oneString: String
, , то вы объявляете тип, который не может быть равен нулю.
Тип String!
- это «неявно разворачиваемый вариант». То есть, это необязательно, так же, как String?
, но тот, который претендует быть необязательным иногда. В основном для целей чтения - вам не нужно явно разворачивать его, чтобы получить значение. Недостаток, если он когда-либо ник (и это полностью может быть), ваш код будет ловушку и прервать.
Но этот притворный для не-факультативно только до сих пор. Вы не можете передать String!
функции inout
, если этот аргумент не является необязательным. Отсюда и ваша проблема.
Ответ Антона полностью верен в том, почему он не будет работать, и предложенная им перегрузка оператора заставит ваш код скомпилировать. Но это не правильное решение - вместо этого вы должны избегать использования неявно-развернутых опций, поскольку они являются подпружиненными deathtraps и только для использования в определенных обстоятельствах (наиболее распространенное из них с элементами управления Cocoa UI). 999 раз из 1000 вам было бы лучше с обычным дополнительным или необязательным
Я думал, что этот вопрос с ответом Антона поможет вам понять, что происходит за кулисами http: // stackoverflow.ком/вопросы/24018327/что-делает-ан-восклицательный знак среднеквадратичных-в-быстрым язык? RQ = 1 –