加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – Obj-C非空函数返回Swift是什么?

发布时间:2020-12-16 06:52:38 所属栏目:百科 来源:网络整理
导读:我有一个客观的c库,可以使用桥接头在 Swift中使用. 我的一个公共方法被注释为返回nonnull但实际上它在某些情况下可以返回nil. 我期待调用此方法的Swift代码会因为“展开nil可选值”而崩溃,但事实上并非如此. Objective-C的: - (nonnull UserService *)users
我有一个客观的c库,可以使用桥接头在 Swift中使用.

我的一个公共方法被注释为返回nonnull但实际上它在某些情况下可以返回nil.

我期待调用此方法的Swift代码会因为“展开nil可选值”而崩溃,但事实上并非如此.

Objective-C的:

- (nonnull UserService *)users
{
    if (!_users && [self checkStarted]) {
        _users = [[UserService alloc] init];
    }
    return _users;
}

-(BOOL) checkStarted
{
    return NO;
}

Swift标题:

generate标头如下所示:

func users() -> UserService

Swift用法:

let userService = sdk.users()

当我输出返回的值时,我得到了这个结果

po userService
<uninitialized>

怎么会?

解决方法

也许存在一个误解:在许多编程语言中,你可能会犯很多错误,比如注释一个值约束,然后就不会实现它.我已经读了几十次C标准,其中包含很多这样的错误.结果通常是您得到一个未定义的行为.结果不是一个明确的崩溃.我从来没有读过这样的“承诺”.这没有任何意义.

所以,简单地说:行为是不确定的.未定义的行为包括没有任何事情崩溃的可能性.

怎么会发生这种情况?

注释非null使编译器能够在某些情况下使代码更好,而在其他情况下则不然.编译器可以通过优化获得优势.但是当然有些情况下编译器不能这样做.

由于您获得了Objective-C对象,因此必须在运行时分派该对象的每条消息.在编译时没有办法做到这一点(至少可以替换方法,可以在子类中覆盖方法等),即使你在Swift中使用该对象. Dynamic Dispatching是Objective-C的工作方式,即使你把它放在Sift上下文中也是如此.

因此Swift调用成为Objective-C消息. Objective-C消息由Objective-C运行时提供,这可以处理消息为nil.所以没有问题.

如果对象发生其他事情,您可能会崩溃. I. e.如果生成的代码尝试访问isa指针,则可能会出现空指针异常.

也许.也许不吧.这是未定义的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读