gpt4 book ai didi

objective-c - 感叹号对于快速初始化程序意味着什么?

转载 作者:IT王子 更新时间:2023-10-29 05:22:36 28 4
gpt4 key购买 nike

我见过 XCode 从 objective-c 初始化器创建的这样的代码:

init!(logMsg: String!, level logLevel: DDLogLevel, flag logFlag: DDLogFlag, context logContext: Int32, file: UnsafePointer<Int8>, function: UnsafePointer<Int8>, line: Int32, tag: AnyObject!, options optionsMask: DDLogMessageOptions)
init!(logMsg: String!, level logLevel: DDLogLevel, flag logFlag: DDLogFlag, context logContext: Int32, file: UnsafePointer<Int8>, function: UnsafePointer<Int8>, line: Int32, tag: AnyObject!, options optionsMask: DDLogMessageOptions, timestamp aTimestamp: NSDate!)

原代码为:

- (instancetype)initWithLogMsg:(NSString *)logMsg
level:(DDLogLevel)logLevel
flag:(DDLogFlag)logFlag
context:(int)logContext
file:(const char *)file
function:(const char *)function
line:(int)line
tag:(id)tag
options:(DDLogMessageOptions)optionsMask;
- (instancetype)initWithLogMsg:(NSString *)logMsg
level:(DDLogLevel)logLevel
flag:(DDLogFlag)logFlag
context:(int)logContext
file:(const char *)file
function:(const char *)function
line:(int)line
tag:(id)tag
options:(DDLogMessageOptions)optionsMask
timestamp:(NSDate *)aTimestamp;

init关键字后面的感叹号是什么意思?

最佳答案

当前接受的答案给出了是什么,但没有给出原因。我认为在这种情况下,了解原因尤为重要。

要直接回答您的问题,它是一个返回 implicitly-unwrapped optional 的初始化程序.

使用init? 来表示初始化可能失败是处理错误的有效方法。它返回一个“可选”(例如 Type?),这意味着要么初始化了一个值,要么什么都不能初始化并且其内容为 nil。但是 init! 什么时候返回一个隐式解包可选值才有用呢?

隐式展开的可选值表明您可以确信您当前使用的值不是 nil 而无需检查它,但它可能在其生命周期的某个时刻为 nil。这与非可选类型形成鲜明对比,非可选类型永远不能为零。由于从初始化程序获取值时,您从其生命周期的一开始就使用该值,因此 init! 的用例不多。

它的存在可能主要是为了帮助 Objective-C 框架转换,以避免必须手动检查每个自动转换的初始化器。 “这个东西可能是零,但可能不是”是 Objective-C 默认情况下的工作方式。在您的情况下,Xcode 无法知道这些方法是否在 100% 的时间内返回初始化值。遍历每一个框架并弄清楚初始化应该返回 Type 还是 Type? 是一项相当大的工作,所以 Type! 是一个同时明智的默认。作为证明,Xcode 足够聪明,可以将包含 (NSError **) 的初始化程序转换为 init?

另一个用例是委托(delegate)给一个你知道永远不会导致失败情况的可失败初始化器。但除此之外,在您自己的 Swift 代码中编写 init! 应该尽可能避免(即使是那种情况仍然很不确定)。

来源:

关于objective-c - 感叹号对于快速初始化程序意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26440520/

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