问题标签 [objective-c-nullability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?
我最近一直在学习 Swift。
我决定编写一个混合 Swift/Objective-C 应用程序,它使用两种语言实现的相同算法来执行计算密集型任务。
该程序计算大量素数。
我定义了一个计算对象的 Swift 和 Objective-C 版本都应该遵守的协议。
这些对象都是单例的,所以我在 Objective-C 中创建了一个典型的单例访问方法:
整个协议如下所示:
该类的 Objective-C 版本完全按照上面定义的方法实现方法,不用担心。
swift版本有一个方法:
但是,如果我将该方法设为协议的必需方法,则会收到编译器错误“类型”CalcPrimesSwift 不符合协议“CalcPrimesProtocol”。
但是,如果我在协议中将单例类方法 sharedInstance 标记为可选,它就可以工作,并且我可以在我的 Swift 类或我的 Objective-C 类上调用该方法。
我是否错过了 Swift 类方法定义中的一些微妙之处?这似乎不太可能,因为我能够在我的 Swift 类或我的 Objective-C 类上调用 sharedInstance() 类方法。
您可以从 Github 下载该项目,如果您愿意,可以查看它。它被称为SwiftPerformanceBenchmark。(关联)
swift - 让我困惑的 Swift 1.2 的变化
我将 Xcode 更新到 6.3,发现新的 Swift 1.2 在我的代码中有一些新错误。
我收到了这个错误:
无法使用类型为 ((Bool!, NSError!) -> void) 的参数列表调用 signUpInBackgroundWithBlock
我该如何解决?
另一个
我收到了这个错误:
“UITextField”没有名为“text”的成员。
我有 3 个错误}
,它说
预期的“,”分隔符。
表达式列表中的预期表达式。
表达式中应有“)”。
我可以在 Swift 1.2 之前运行我的应用程序,但现在......
objective-c - Objective-C 可空性:限定常量字符串
我已经养成了一个很好的习惯,即为NSNotification
名称之类的东西声明和使用常量字符串。我这样声明它们:
随着 Xcode 6.3 和 Swift 1.2 的引入,我将回过头来审核使用 new 、 和 限定符与 Swift 互操作的 Objective- nonnull
Cnullable
类null_unspecified
。
将限定符添加到也具有外部可见静态字符串的标头时,我收到以下警告:
警告:指针缺少可空性类型说明符(__nonnull 或 __nullable)
唔。这令人困惑/有趣。有人可以解释此消息背后的原因吗?在 Swift 中使用ABCAwesomeThingHappenedNotification
时,它从不暗示它是可选字符串或隐式解包字符串。
objective-c - 如何使编译器默认假定为“可为空”
从 Xcode 6.3 开始,Objective-C 中的类型可以用nullable
或标记nonnull
,这是 Apple 的博客文章。
问题是,如果两者都没有指定,那么编译器会将 Objective-C 代码导入为隐式解包到 Swift 中,例如NSView!
. 所以当一个对象实际上是nil 时,它会在从 Swift 访问时崩溃。这不会产生编译器错误。
由于这极容易失败,我希望编译器默认将 Objective-C 中的所有内容假定为nullable
,除非另有指定 vianonnull
或审核的区域宏NS_ASSUME_NONNULL_BEGIN / END
。怎样才能做到这一点?
ios - PF_NULLABLE 解析框架难以理解,向 PFUser 发送 Message
使用 Xcode 6.3 解析。框架给了我错误,所以我下载了更新的 Parse 框架并开始工作。
现在,有一些新的东西我试图理解这种方法logInWithUsername
是什么。以前它过去很简单。我在编写代码时看到了更多的空值。在某些时候我会感到困惑,主要是指向指针(即NSError
)的指针。
当我跳到定义时,这是一个完全不同的故事,这里的语法似乎很清楚:
我是否在此框架的配置或设置方面遗漏了什么?
swift - Swift 在可空性可用之前使用隐式展开的 Optional
在 Apple 关于可空性的博客中,他们提到了这一点:
“...在 Swift 中,可选引用和非可选引用之间有很大的区别,例如 NSView 与 NSView?,而 Objective-C 将这两种类型都表示为 NSView *。因为 Swift 编译器无法确定一个特定的 NSView * 是否是可选的,该类型被引入 Swift 作为隐式展开的可选,NSView!”
这是否意味着之前在 Swift 中将 Objective-C 方法声明为返回隐式展开的可选方法时,它实际上可能会崩溃(因为使用隐式展开的可选方法声明的某些方法可能返回 nil)?或者 Apple 是否确保只有那些绝对不返回 nil 的 Objective-C 方法被声明为隐式解包可选?
objective-c - Objective-C 中可为空、__nullable 和 _Nullable 之间的区别
在 Xcode 6.3 中引入了新的注解,以更好地表达Objective-C中 API 的意图(当然也确保更好的 Swift 支持)。那些注释当然是nonnull
,nullable
和null_unspecified
.
但是在 Xcode 7 中,出现了很多警告,例如:
指针缺少可空性类型说明符(_Nonnull、_Nullable 或 _Null_unspecified)。
除此之外,Apple 使用另一种类型的可空性说明符,标记它们的 C 代码(源代码):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
所以,总而言之,我们现在有这 3 个不同的可空性注释:
nonnull
,nullable
,null_unspecified
_Nonnull
,_Nullable
,_Null_unspecified
__nonnull
,__nullable
,__null_unspecified
即使我知道为什么以及在哪里使用哪个注释,我还是对我应该使用哪种类型的注释、在哪里以及为什么使用感到有些困惑。这是我可以收集到的:
- 对于属性,我应该使用
nonnull
,nullable
,null_unspecified
. - 对于方法参数,我应该使用
nonnull
,nullable
,null_unspecified
. - 对于 C 方法,我应该使用
__nonnull
,__nullable
,__null_unspecified
. - 对于其他情况,例如双指针,我应该使用
_Nonnull
,_Nullable
,_Null_unspecified
.
但是我仍然对为什么我们有这么多基本上做同样事情的注释感到困惑。
所以我的问题是:
这些注释之间的确切区别是什么,如何正确放置它们以及为什么?
objective-c - NSError、Swift 和可空性
我正在用 Objective-C 编写一组工具,Swift 会在某些时候使用这些工具,所以我使用泛型和可空性。在这种情况下我该怎么办?
目前我收到一个警告:Pointer is missing a nullability type specifier...
两个指针!我几乎可以肯定我不应该这样做:
我是吗?
objective-c - 从不兼容的类型 _Nonnull 分配给 _Nullable 的警告,但更改修饰符没有任何作用
我有一个定义以下方法的协议:
实现它的类有一个属性:
该方法的实现如下:
这是确切的警告:
从不兼容的类型'__strong id _Nonnull'分配给'id _Nullable'
更改可空性不会做任何事情。
编辑:我在 .m 文件中有以下类扩展名: