gpt4 book ai didi

objective-c - 防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

转载 作者:行者123 更新时间:2023-12-04 09:27:19 24 4
gpt4 key购买 nike

我正在处理一个问题,即 Obj-C 代码可以将 nil 传递给不采用可选参数的 Swift 方法。

我正在为 Xcode 编译器寻找一种方法来防止这种情况发生。似乎所有的可空性注解都是为了让 Swift 调用 Objc,而不是相反。

一些示例代码:

// file1.swift
@objc
class Foo: NSObject {
@objc let date: Date? // default to nil
...
}

// file2.swift
extension Date {
@objc(doSomethingWithOtherDate:)
func doSomething(with otherDate: Date) {
print(date)
}
}

然后在Obj-c中,我们调用Swift方法传入一个可选值,nil:

// file3.m
[Date.new doSomethingWithOtherDate:[Foo.new date]];

有没有办法避免这种情况?我们如何告诉编译器 doSomethingWithOtherDate 不采用 nil

跟进

跟进这个问题,在调用中传递文字 nil 会触发警告,这非常有帮助。但是,传递一个 nil 值不会触发任何事情。然而,如果 nil 引用是本地的,静态分析器确实会发现问题。

但是,如果通过另一个对象传递了一个 nil 引用,则静态分析器无法识别此问题。

Objc - Swift crash

我制作了这个 repo 来展示这个问题:https://github.com/eneko/ObjcCrashDemo

最佳答案

一般来说,不会。 Objective-C 对可空性没有足够的了解来检测每种情况。

如果您显式传递 nil,您应该得到警告“Null 传递给需要非空参数的被调用方”。您可以通过将 -Werror=nonnull 添加到build设置中的“其他警告标志”来将此转化为错误。

然而,这是极其有限的。即使像 NSDate* date = nil; 这样简单的东西,传递它也不会产生警告/错误。即使在 Objective-C 中添加 nonnull 属性并传递它也不会产生警告/错误。

关于objective-c - 防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62959111/

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