2014-11-14 84 views
0

Swift應該如何實現?編譯器錯誤是「不能調用‘==’類型的參數列表‘(NSURL,NilLiteralConvertible)’」你如何檢查NSURLRequest.URL是否爲零?

var request = NSURLRequest() 
    if request.URL == nil { 
    } 

這似乎是正常的模式是申報類型可選對象時可能沒有值。

但是在這種情況下,我不確定Apple爲什麼沒有在NSURLRequest類中將URL屬性聲明爲可選var。

+0

看起來像這樣,但仍然不確定爲什麼設計模式要求非可選,如果值可以爲零:如果request.URL爲AnyObject? ==零{} – Lee 2014-11-14 20:45:21

+0

這是什麼意圖?你想分配一個可選的,然後檢查它是否稍後分配?如果是這樣,稍後再初始化請求並使其成爲可選項。 – 2014-11-14 20:45:44

+0

其意圖是真正瞭解nillable對象的多少次 - >可選是一個不正確的假設。 – Lee 2014-11-14 20:48:54

回答

3

因爲這在正常的(也是唯一有意義的)用例中會很痛苦。正常的用例是調用指定的初始值設定項(initWithURL:),或者用真實的URL調用指定的初始值設定項。因此,在所有普通代碼中,您必須每次卸載NSURL?。那會快速變老。

如果這是一個從頭開始的Swift對象,那麼它將沒有公開的init(),但是你不能刪除它,因爲它是合法的(雖然毫無意義)ObjC。 (好吧,也許他們可以刪除它;這可能是值得一個雷達,以標記其私人init()

所以這是一個妥協與ObjC作爲通常編程與ObjC作爲法律語法。圍繞Swift調用Cocoa的許多奇怪之處歸結於此。

如果ObjC dev使用[[NSURLRequest alloc] init]作爲常見模式,那麼URL肯定會是可選的。 ObjC開發人員幾乎從不這樣做,所以事實並非如此。

請注意,如果您發現自己處於NSURLRequest()似乎有用的情況下,那麼幾乎可以肯定使用NSURLRequest?代替。

+2

更多信息。似乎學習Swift/ObjectiveC/Cocoa的交互比學習Swift語言本身更復雜。 – Lee 2014-11-14 20:59:31

+0

很多。 Swift嚴重依賴Cocoa。可可是基於幾十年的ObjC歷史和文化。雖然我認爲人們可以先學習Swift,但我認爲他們錯誤地認爲在沒有ObjC背景的情況下它會很容易*。 – 2014-11-14 21:14:54

1

好問題。幸運的是,request.URL.absoluteString是可選的。我認爲這會做你的需要:

if (request.URL.absoluteString == nil) { ... } 

或者,由於NSMutableURLRequest使用可選當URL被取出,另一種選擇是使用NSMutableURLRequest()來代替,是否適合你的使用情況。

var request = NSMutableURLRequest() 
if (request.URL == nil) { ... } 
1

你不知道。 URL是一個非可選的只讀變量NSURLRequest

如果你留在swift中,這個參數沒有辦法可以爲零。除非你使用NSURLRequest()初始值設定項,這是非常沒有意義的,因爲URL是隻讀的,你不能設置它。

使用指定的初始值設定項之一。或者使用NSMutableURLRequest,它有一個URL變量,它不是隻讀的,也是可選的。

+2

'let request = NSURLRequest(); println(request.URL)'在Swift中導致錯誤,因爲'URL'是'nil'。 – 2014-11-14 20:50:50

+1

(您的解決方案是正確的,但是您的聲明「此參數無法爲零」不是)。 – 2014-11-14 20:51:21

+0

是的,但您爲什麼要這樣做?沒有URL的NSURLRequest是毫無意義的。 – 2014-11-14 20:51:33