Swift應該如何實現?編譯器錯誤是「不能調用‘==’類型的參數列表‘(NSURL,NilLiteralConvertible)’」你如何檢查NSURLRequest.URL是否爲零?
var request = NSURLRequest()
if request.URL == nil {
}
這似乎是正常的模式是申報類型可選對象時可能沒有值。
但是在這種情況下,我不確定Apple爲什麼沒有在NSURLRequest類中將URL屬性聲明爲可選var。
Swift應該如何實現?編譯器錯誤是「不能調用‘==’類型的參數列表‘(NSURL,NilLiteralConvertible)’」你如何檢查NSURLRequest.URL是否爲零?
var request = NSURLRequest()
if request.URL == nil {
}
這似乎是正常的模式是申報類型可選對象時可能沒有值。
但是在這種情況下,我不確定Apple爲什麼沒有在NSURLRequest類中將URL屬性聲明爲可選var。
因爲這在正常的(也是唯一有意義的)用例中會很痛苦。正常的用例是調用指定的初始值設定項(initWithURL:
),或者用真實的URL調用指定的初始值設定項。因此,在所有普通代碼中,您必須每次卸載NSURL?
。那會快速變老。
如果這是一個從頭開始的Swift對象,那麼它將沒有公開的init()
,但是你不能刪除它,因爲它是合法的(雖然毫無意義)ObjC。 (好吧,也許他們可以刪除它;這可能是值得一個雷達,以標記其私人init()
所以這是一個妥協與ObjC作爲通常編程與ObjC作爲法律語法。圍繞Swift調用Cocoa的許多奇怪之處歸結於此。
如果ObjC dev使用[[NSURLRequest alloc] init]
作爲常見模式,那麼URL
肯定會是可選的。 ObjC開發人員幾乎從不這樣做,所以事實並非如此。
請注意,如果您發現自己處於NSURLRequest()
似乎有用的情況下,那麼幾乎可以肯定使用NSURLRequest?
代替。
更多信息。似乎學習Swift/ObjectiveC/Cocoa的交互比學習Swift語言本身更復雜。 – Lee 2014-11-14 20:59:31
很多。 Swift嚴重依賴Cocoa。可可是基於幾十年的ObjC歷史和文化。雖然我認爲人們可以先學習Swift,但我認爲他們錯誤地認爲在沒有ObjC背景的情況下它會很容易*。 – 2014-11-14 21:14:54
好問題。幸運的是,request.URL.absoluteString是可選的。我認爲這會做你的需要:
if (request.URL.absoluteString == nil) { ... }
或者,由於NSMutableURLRequest使用可選當URL被取出,另一種選擇是使用NSMutableURLRequest()來代替,是否適合你的使用情況。
var request = NSMutableURLRequest()
if (request.URL == nil) { ... }
你不知道。 URL
是一個非可選的只讀變量NSURLRequest
。
如果你留在swift中,這個參數沒有辦法可以爲零。除非你使用NSURLRequest()
初始值設定項,這是非常沒有意義的,因爲URL是隻讀的,你不能設置它。
使用指定的初始值設定項之一。或者使用NSMutableURLRequest
,它有一個URL
變量,它不是隻讀的,也是可選的。
'let request = NSURLRequest(); println(request.URL)'在Swift中導致錯誤,因爲'URL'是'nil'。 – 2014-11-14 20:50:50
(您的解決方案是正確的,但是您的聲明「此參數無法爲零」不是)。 – 2014-11-14 20:51:21
是的,但您爲什麼要這樣做?沒有URL的NSURLRequest是毫無意義的。 – 2014-11-14 20:51:33
看起來像這樣,但仍然不確定爲什麼設計模式要求非可選,如果值可以爲零:如果request.URL爲AnyObject? ==零{} – Lee 2014-11-14 20:45:21
這是什麼意圖?你想分配一個可選的,然後檢查它是否稍後分配?如果是這樣,稍後再初始化請求並使其成爲可選項。 – 2014-11-14 20:45:44
其意圖是真正瞭解nillable對象的多少次 - >可選是一個不正確的假設。 – Lee 2014-11-14 20:48:54