You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS部署目标从8升10后出现BOOL与void类型不兼容初始化错误如何解决?

iOS中“用void类型表达式初始化BOOL(别名signed char)”错误解析与修复

咱们先把这个错误的本质说透:这个报错其实是编译器在提醒你——你把一个没有返回值(void类型)的操作,当成了有布尔值(BOOL本质是signed char的别名)的结果来使用了,要么是给BOOL变量赋值,要么是作为BOOL类型方法的返回值,类型完全不匹配,所以触发了错误。

为什么升级到iOS10后才出现这个问题?

结合你贴的代码片段来看,问题大概率出在SFSafariViewController的相关调用上。在iOS 9到iOS10的版本迭代中,部分API的返回类型做了调整,再加上升级后编译器的类型检查变得更严格,之前没暴露的隐性问题就显现出来了。

最常见的触发场景是:你的方法presentAuthorizationWithURL:session:需要返回BOOL,但你可能写了类似这样的代码:

return [self presentViewController:safariVC animated:YES completion:nil];

但你不知道的是,presentViewController:animated:completion:这个方法的返回类型是void,根本没有返回值!你把这个void类型的表达式当成BOOL返回,自然就触发了这个错误。

怎么快速修复这个问题?

针对你的代码场景,有两种简单可行的修复方式:

方式一:明确返回BOOL值

既然presentViewController:本身不返回值,那咱们在调用它之后直接返回明确的BOOL结果就行,比如表示授权流程已成功启动就返回YES

if (@available(iOS 9.0, *)) {
    if ([SFSafariViewController class]) {
        SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:URL];
        safariVC.delegate = self;
        [self presentViewController:safariVC animated:YES completion:nil];
        return YES; // 这里明确返回BOOL类型的值
    }
}
// 别忘了处理其他分支的返回,比如不满足iOS9或者SFSafariViewController不存在的情况
return NO;

方式二:梳理全路径的返回逻辑

确保你的方法presentAuthorizationWithURL:session:的所有代码分支都有明确的BOOL返回值,不要让编译器“猜”你要返回什么。比如如果展示控制器失败就返回NO,成功就返回YES,把每个分支的返回逻辑都补全。

另外还要提醒你:可以通过Xcode的“跳转到定义”(按住Command点击方法名)查看API的返回类型,确认你调用的方法是不是真的有BOOL返回值,避免因为iOS版本差异导致的API返回类型变化踩坑。

内容的提问来源于stack exchange,提问作者Prathap Reddy

火山引擎 最新活动