【问题标题】:How do you check if NSURLRequest.URL is nil?你如何检查 NSURLRequest.URL 是否为零?
【发布时间】:2014-11-15 04:58:31
【问题描述】:

这应该如何在 Swift 中完成?编译器错误是“无法使用类型为 '(NSURL, NilLiteralConvertible)' 的参数列表调用 '=='”

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

似乎正常的模式是在对象可能没有值时声明类型为可选。

但是在这种情况下,我不确定为什么 Apple 没有在 NSURLRequest 类中将 URL 属性声明为可选变量。

【问题讨论】:

  • 看起来这样可行,但仍然不确定为什么如果值可以为 nil 时设计模式要求非可选:如果 request.URL as AnyObject? == 无 { }
  • 目的是什么?您是否要分配一个可选项,然后检查它是否稍后分配?如果是这样,请稍后初始化请求并将其设为可选。
  • 真正的目的是了解可空对象的频率 -> Optional 是一个不正确的假设。

标签: ios swift


【解决方案1】:

因为这在正常(也是唯一有意义的)用例中会很痛苦。正常的用例是调用指定的初始化程序(initWithURL:),或者用真实的 URL 调用指定的初始化程序。因此,在所有普通代码中,您必须每次都卸载 NSURL?。那样会很快变老。

如果这是一个从头开始的 Swift 对象,那么它不会有 public init(),但你不能删除它,因为它是合法的(尽管没有意义)ObjC。 (好吧,也许他们可以删除它;这可能值得用雷达将其标记为 init() 私有。)

所以这是 ObjC-as-typically-programmed vs ObjC-as-legal-syntax 的折衷方案。从 Swift 调用 Cocoa 的许多奇怪之处都归结为这一点。

如果 ObjC 开发人员使用 [[NSURLRequest alloc] init] 作为通用模式,那么 URL 肯定是可选的。 ObjC 开发人员几乎从不这样做,所以不是。

请注意,如果您发现自己遇到了NSURLRequest() 似乎有用的情况,那么真正正确的答案几乎肯定是改用NSURLRequest?

【讨论】:

  • 好消息。似乎学习 Swift/ObjectiveC/Cocoa 的交互比学习 Swift 语言本身更复杂。
  • 很多。 Swift 严重依赖 Cocoa。 Cocoa 基于数十年的 ObjC 历史和文化。虽然我认为人们可以先学习 Swift,但我认为他们错误地认为没有 ObjC 的背景会简单
【解决方案2】:

你没有。 URLNSURLRequest 的非可选只读变量。

如果你保持在 swift 中,这个参数是不可能为 nil 的。除非您使用 NSURLRequest() 初始化程序,否则这毫无意义,因为 URL 是只读的并且您无法设置它。

使用指定的初始值设定项之一。或者使用NSMutableURLRequest,它有一个URL 变量,它不是只读的并且是可选的。

【讨论】:

  • let request = NSURLRequest(); println(request.URL) 在 Swift 中导致错误,因为 URLnil
  • (您的解决方案是正确的,但您的“这个参数不可能为零”的说法是错误的。)
  • 是的,但你为什么要这样做?没有 URL 的 NSURLRequest 是没有意义的。
  • Apple 应该在普通的 NSURLRequest() 初始化程序中抛出一个错误,不过
  • 我同意。 @MatthiasBauch I opened a bug 在这种情况下建议非指定初始化程序的 Swift 错误。
【解决方案3】:

好问题。幸运的是,request.URL.absoluteString 是可选的。我认为这将满足您的需求:

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

或者,由于 NSMutableURLRequest 在获取 URL 时使用了一个可选参数,因此另一个选项是使用 NSMutableURLRequest() 代替,如果这适用于您的用例。

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

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多