gpt4 book ai didi

swift - 怎么是AnyObject的返回值啊!不同于 AnyObject

转载 作者:搜寻专家 更新时间:2023-10-31 21:50:04 24 4
gpt4 key购买 nike

Swift下Cocoa框架中的NSMetadataItem类包含如下功能:

func valueForAttribute(key: String!) -> AnyObject!

我仍在了解强制展开和可选链接之间的区别(和细节)。在上面的函数中,这是否意味着:

  1. key 参数必须有值,并且

  2. 返回值保证有值?

我主要关心的是返回值后的感叹号 - 一旦我分配了返回值:

var isDownloadedVal = item.valueForAttribute(NSMetadataUbiquitousItemIsDownloadedKey)

我是否需要在检查它时包含一个 if let block ,或者我是否保证它会有一个我可以安全检查的值?

最佳答案

TLDR:对待 Foo!好像是Foo .

许多 Cocoa 调用都包含隐式展开的可选值,它们对它的需求很可能是该功能存在的原因。以下是我建议的思考方式。

首先,让我们考虑一个不涉及 AnyObject 的更简单的案例.我想UIDevice是一个很好的例子。

class func currentDevice() -> UIDevice!

这是怎么回事?嗯,总有一个 currentDevice .如果返回 nil这将表明系统中存在某种深度错误。所以如果我们在 Swift 中构建这个接口(interface),它可能只会返回 UIDevice。并完成它。但是我们需要连接到 Objective-C,它返回 UIDevice* .现在不应该是 nil , 但它在句法上可能nil .现在在 ObjC 中,我们通常会忽略这个事实并且不会 nil - 在此处查看(特别是因为 nil - 消息传递通常是安全的)。

那么我们如何在 Swift 中表达这种情况呢?好吧,从技术上讲,它是一个 Optional<UIDevice> ,你会得到:

class func currentDevice() -> UIDevice?

并且您需要在每次使用它时显式解包(最好使用 if let block )。那会很快让你发疯,而且毫无意义。 currentDevice()总是返回一个值。 Optional是桥接到 ObjC 的产物。

因此他们发明了一种 hack 来解决这个问题(我认为这确实是一种 hack;如果没有 ObjC,我无法想象构建此功能)。黑客说,是的,这是一个 Optional ,但您可以假装它不是,我们保证它始终是一个值。

那是 ! .对于这种东西,你基本上忽略了!并假装它正在给你返回一个 UIDevice并滚动。如果他们对你撒谎并返回 nil ,好吧,那会崩溃的。他们不应该对你撒谎。

这暗示了一条规则:不要使用 !除非你真的需要(而且你几乎只需要在桥接到 ObjC 时)。

在您的具体示例中,这适用于两个方向:

func valueForAttribute(key: String!) -> AnyObject!

技术上它需要一个 Optional<String> , 但只是因为它桥接到 NSString* .您必须通过非 nil这里。从技术上讲,它会返回给您 Optional<AnyObject> , 但只是因为它桥接到 id .它保证不会是 nil .

关于swift - 怎么是AnyObject的返回值啊!不同于 AnyObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24061039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com