2014-10-11 4 views
2

Я пытаюсь переопределить Optional в Swift. Я называю это Maybe. У меня есть 2 inits, чтобы создать пустую или нулевую версию и один держит общий тип:По умолчанию init в Swift перечисление игнорируется

enum Maybe<T>{ 
    case Nothing 
    case Something(T) 

    init(){ 
     self = .Nothing 
    } 

    init(_ something: T){ 
     self = .Something(something) 
    } 

} 

Однако, когда я пытаюсь создать пустой Maybe, то init() инициализатор не называется. Вместо этого другой init(_ something: T) вызывается с T =().

Что происходит? Почему инициализация без параметров игнорируется?

var z = Maybe() // this calls init(_ something: T) with T =() 
+0

И теперь swift 4 не будет компилироваться, если вы явно не задали тип generate. – ZYiOS

ответ

1

Свифт компилятор необходим контекст определить тип T, например

var foo = Maybe<Int>() 
var bar : Maybe<String> = Maybe() 

Та же проблема будет с

let x = Optional() 
switch x { 
case .None: 
    println("None") 
case .Some(let y): 
    println("Some \(y)") 
} 

, который печатает Some() и вызывает предупреждение компилятора

warning: variable 'x' inferred to have type 'Optional<()>', which may be unexpected 
+0

Похоже, вы прибили его. Тем не менее, я до сих пор не понимаю, почему компилятор, когда отсутствует информация о родовом типе, решает игнорировать первый инициализатор ... Любые подсказки? – cfischer

+0

@cfisher: Я заметил, что если у вас есть * общая функция *, принимающая один аргумент 'func foo (x: T) {println (x)}', то вы можете фактически называть 'foo()', и вы получаете тот же результат как с 'foo (())'. Итак, 'var z = Maybe()' представляется интерпретируемой как 'var z = Maybe (())'. Но я понятия не имею, если это намеренно или ошибка. –

+0

Похоже, он специализируется по умолчанию(). Похож на ошибку для меня ... – cfischer

Смежные вопросы