2014-11-08 56 views
1

我試圖讓NSNull符合NilLiteralConvertible,但我遇到了挫折的巨大量:製作NSNull符合NilLiteralConvertible

extension NSNull : NilLiteralConvertible{ 

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

首先,我被迫做出init一個convenience之一,因爲我不能在擴展中添加指定的初始值。

然後,編譯器變得瘋狂並堅持init必須被製作爲required,並且在投訴後必須立即將required初始化器直接添加到類中,而不是擴展名中。 WTF?

playground

任何人都知道這是怎麼回事,以及如何使NSNull順應這種簡單的協議?

我在Xcode遊樂場測試這個。

+0

什麼是你的使用情況? – Shuo 2014-11-09 01:54:38

回答

1

應該沒有理由符合NSNullNilLiteralConvertible。雖然該協議是公開的,但它主要在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