2014-11-14 4 views
0

Как это сделать в Swift? Ошибка компилятора «не может ссылаться на„==“со списком аргументов типа '(NSURL, NilLiteralConvertible)»Как вы проверяете, нет ли NSURLRequest.URL?

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

Похоже, нормальная картина объявить типы необязательным, когда объект не может иметь стоимость.

Однако в этом случае я не уверен, почему Apple не объявила свойство URL как необязательный var в классе NSURLRequest.

+0

Похоже, что это работает, но все еще не уверен, почему шаблон дизайна вызывает не факультативный, если значение может быть nil: if request.URL как AnyObject? == nil {} – Lee

+0

Какое намерение? Вы хотите назначить опциональную, затем проверку, чтобы узнать, назначено ли позже? Если это так, просто инициализируйте запрос позже и сделайте его необязательным. –

+0

Цель состоит в том, чтобы понять, насколько часто возможен nillable object -> Optional - неправильное предположение. – Lee

ответ

3

Потому что это будет боль в нормальном (и только значимом) варианте использования. Обычным вариантом использования является вызов назначенного инициализатора (initWithURL:) или что-то, что вызывает назначенный инициализатор с реальным URL-адресом. Таким образом, во всех нормальных кодах вам придется выгружать NSURL? каждый раз. Это быстро стало бы быстро.

Если бы это был объект Swift с нуля, тогда у него не было бы публичного init(), но вы не можете удалить его, потому что это законный (хотя и бессмысленный) ObjC. (Ну, может быть, они могут удалить его, что может стоить радару, чтобы отметить его частным.)

Так что это компромисс с ObjC-как обычно запрограммированным и ObjC-как-юридическим синтаксисом. Многие из странностей вокруг вызова Какао от Свифта сводятся к этому.

Если ObjC dev использовал [[NSURLRequest alloc] init] в качестве общей картины, тогда URL, безусловно, был бы необязательным. Разработчики ObjC в значительной степени никогда не делают этого, так что это не так.

В качестве примечания, если вы находите себя в случае, когда NSURLRequest() представляется полезным, на самом деле правильный ответ почти наверняка будет использовать NSURLRequest?.

+2

Хорошая информация. Кажется, изучение взаимодействия Swift/ObjectiveC/Cocoa более сложное, чем изучение самого языка Swift. – Lee

+0

Много. Свифт сильно зависит от какао.Какао основано на десятилетиях истории и культуры ObjC. Хотя я понимаю, что люди могут сначала изучить Swift, я думаю, что они ошибаются, думая, что это будет легко * без фона в ObjC. –

1

Хороший вопрос. К счастью, request.URL.absoluteString является необязательным. Я думаю, что это будет делать то, что вам нужно:

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

Или, так как NSMutableURLRequest использует дополнительный, когда URL извлекается, другой вариант заключается в использовании NSMutableURLRequest() вместо того, чтобы, если это работает для вашего использования.

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

У вас нет. URL является необязательной переменной только для чтения NSURLRequest.

Если вы останетесь в быстром темпе, этот параметр не может быть равен нулю. Если вы не используете инициализатор NSURLRequest(), что довольно бессмысленно, потому что URL-адрес доступен только для чтения, и вы не можете его установить.

Используйте один из назначенных инициализаторов. Или используйте NSMutableURLRequest, который имеет переменную URL, которая не доступна только для чтения и необязательна.

+2

'let request = NSURLRequest(); println (request.URL) 'вызывает ошибку в Swift, потому что' URL' - 'nil'. –

+1

(Ваши решения верны, но ваше утверждение о том, что «нет способа, которым этот параметр может быть равен нулю», нет.) –

+0

Да, но зачем вы это делаете? NSURLRequest без URL-адреса не имеет смысла. –

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