【问题标题】:NSDate() vs NSDate.date() in SwiftSwift 中的 NSDate() 与 NSDate.date()
【发布时间】:2014-12-25 01:14:34
【问题描述】:

我正在关注Bloc.io Swiftris tutorial,他们通过以下方式初始化日期:

lastTick = NSDate.date()

导致编译错误:

'date()' is unavailable: use object construction 'NSDate()'

应该等于:

NSDate *lastTick = [NSDate date];

(来自NSDate reference

Apple 是否更改了Swift interface to NSDate,因为我看到了其他使用NSDate.date 的示例?

这只是 NSDate 还是不能为任何 Objective-C API 调用类型方法?

【问题讨论】:

  • 在 Objective-C 中,[NSDate date] 只是调用[[NSDate alloc] init]。因此,您无需在 Swift 中调用 NSDate.date()。只需调用NSDate() 即可使用当前日期初始化一个日期对象。
  • @ZeMoon 你为什么删除你的答案?我正要接受它。
  • 好吧,我认为它更多地用作评论,但显然它足以作为答案......取消删除它,你至少可以投票,如果不接受它......: D
  • 你是不是把 NSDate.date() 误认为是 NSDate.init() 了?
  • 不,我正在学习使用 .date 的教程。它在问题中说得很清楚。

标签: ios objective-c swift cocoa nsdate


【解决方案1】:

[NSDate date] 是用于构造 NSDate 对象的工厂方法。

如果您阅读指南“将 Swift 与 Cocoa 和 Objective-C 一起使用”,其中有一节是关于与 Objective-C api 交互的:

为了一致性和简单性,Objective-C 工厂方法被映射为 Swift 中的便利初始化器。这种映射允许它们使用与初始化器相同的简洁明了的语法。”

摘自:Apple Inc.“将 Swift 与 Cocoa 和 Objective-C 结合使用”。电子书。 https://itun.es/gb/1u3-0.l

所以工厂方法:

[NSDate date]

在 Swift 中被转换为初始化器

NSDate()

不只是在 NSDate 中可以找到这种模式,在其他带有工厂方法的 Cocoa API 中也是如此。

【讨论】:

  • 毫无疑问,如果该类是从新实现的,Apple 也不会在 Objective-C 中提供[NSDate data]; ARC 意味着在简单的alloc] init] autorelease]; 风格的工厂方法中提供的额外便利有限。
【解决方案2】:

NSDate() 似乎是新语法。以前,NSDate.date() 工作过,

但是现在你应该使用 NSDate()

【讨论】:

  • 其实NSDate.date()给了我一个编译器错误。
  • 是的,不再支持旧语法
  • @ChikabuZ 您的错误措辞具有误导性。如果您的意思是“以前,NSDate.date() 有效”,那么不要写“早期 NSDate.date() 有效”,因为它们的意思完全不同。
  • 这也回答了我的问题,我已经知道我应该使用问题中的错误消息中的NSDate()(我不是白痴)。我的问题是关于为什么 Swift 接口不同于 Obj.-C
  • 我认为 Apple 决定将语法更改为更直观、更简短。 [NSDate date] 和 NSDate() 看起来不错,但 NSDate.date() 更差。
【解决方案3】:

在 Objective-C 中,[NSDate date] 只是调用[[NSDate alloc] init]。因此,您不需要在 Swift 中调用 NSDate.date()。只需调用NSDate() 即可使用当前日期初始化一个日期对象。

【讨论】:

    【解决方案4】:

    Apple 是否将 Swift 接口更改为 NSDate

    是的,他们做到了。对我来说,编译器告诉:

    Foundation.NSDate:3:26:注意:“date()”已在此处明确标记为不可用:

    @objc(date) class func date() -> Self!

    因此它被明确标记为对 Swift 不可用。这意味着它已被正式弃用。

    【讨论】:

    • Xcode 中是否有一些设置可以获取这样的折旧消息?
    • @papirtiger 抱歉,我不明白你指的是什么——编译器错误默认显示在 Xcode 中(据我所知……我不使用 Xcode。)
    • 我在 Xcode 中只得到'date()' is unavailable: use object construction 'NSDate()'。你用什么编译器?
    • @papirtiger 我使用与 Xcode 捆绑的相同 Swift 编译器(因为没有其他 Swift 编译器)。我使用xcrun swift 运行它。
    • 也许你没有使用相同版本的 Xcode。 Apple 在 6.1 中对此进行了更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2016-05-26
    • 1970-01-01
    • 2015-04-27
    • 2023-03-18
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多