В Swift необязательно просто общее перечисление с двумя падежами:
enum Optional<T> {
case some(T)
case none
}
Например, String?
- это то же самое, что и Optional<String>
.
Если вы объявите MyObject<String?>
, в основном вы создаете MyObject<Optional<String>>
, то ваш конкретный start
метод будет
func start(_ value: Optional<Optional<String>>) { ... }
Это означает, что если вы назовете его как start(nil)
, весь объект будет, конечно, равен нулю, и if let
не удастся.
Однако вы можете вызвать эту функцию следующим образом
MyObject<String?>().start(Optional.some(Optional.none))
MyObject<String?>().start(.some(.none)) // -> shorter version with type inference
По сути, теперь существует внешний необязательный параметр, и развертывание работает, но внутренним является nil
.
Однако я до сих пор не могу понять, зачем вам делать что-то подобное