2014-11-08 5 views
1

Я пытаюсь сделать NSNull соответствовать NilLiteralConvertible, но я бегу в огромном количестве разочарования:Изготовление NSNull соответствовать NilLiteralConvertible

extension NSNull : NilLiteralConvertible{ 

    required convenience init(nilLiteral:()){ 
     self.init() 
    } 
} 

Прежде всего, я вынужден сделать init a convenience один, поскольку я не могу добавить назначенные инициализаторы в расширение.

Затем компилятор сходит с ума и настаивает на том, что init должен быть сделан required и сразу же после того, как жалобы, что инициализаторы required должны быть добавлены непосредственно в класс, а не в расширение. WTF ?!

playground

Кто знает, что происходит и как сделать NSNull соответствовать этому простому протоколу?

Я тестирую это на игровой площадке Xcode.

+0

Что вы Прецедент? – Shuo

ответ

1

Не должно быть причин для соответствия NSNull - NilLiteralConvertible. Хотя протокол является общедоступным, он в основном используется внутри по умолчанию: NSZone и реализация опций в языке (см. Ссылки в источнике here). Вы можете получить желаемое поведение, если хотите, указав переменную как Optional<NSNull>. Optional перечисление соответствует NilLiteralConvertible для вас, как показано в источнике Optional.swift:

Это не работает:

var null: NSNull 

null = NSNull() // <null> 
null = nil // error: nil cannot be assigned to type 'NSNull' 

Но это делает:

var null: NSNull? 

null = NSNull() // <null> 
null = nil // nil