指针在自动生成的 ModuleName-Swift.h 文件中缺少可空性类型说明符

And*_*nov 5 xcode objective-c swift

我有一个带有 swift 和 ObjC 源的项目,并且在自动生成的头文件中有一条奇怪的消息:

在此处输入图片说明

标有错误的代码:

//interface in ModuleName-Swift.h  file
@interface PointsList : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithPoints:(NSArray<NSValue *> * /*this marked with warning*/_Nonnull)points OBJC_DESIGNATED_INITIALIZER; //Warning:Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
- (nonnull instancetype)initWithValues:(NSArray<NSValue *> * /*this marked with warning*/_Nonnull)pointValues //Warning:Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
@end



//source PointsList.swift
   @objc public class PointsList : NSObject {

    var points = Array<CGPoint>()
    @objc public override init() {
        super.init()
    }
    @objc public init(withPoints points: Array<CGPoint>) {
        self.points.append(contentsOf: points)
        super.init()
    }
    @objc public init(withValues pointValues: Array<NSValue>) {
        super.init()
        pointValues.forEach { (pointValue) in
                self.points.append(pointValue.cgPointValue)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个文件是由 Xcode 从 swift 的类中生成的。我看到 _Nunnull 修饰符,但 XCode 抱怨我应该添加该修饰符。也许我忘记了项目配置中的一些设置。
我该如何解决这种奇怪的行为?

UPD
我对 Swift 5 和 Xcode 10.2 有同样的问题。
很奇怪,因为我项目中的其他文件以正确的方式处理。
只有_Nonnull和_Nullable修饰符有问题。Xcode 忽略它们,如果我按下Fix警告消息中的按钮,Xcode 会向指针添加第二个修饰符,并且警告不会移开。

Cas*_*sey 0

在纯 ObjC 中,您实际上不需要使用_Nullableand _Nonnull。这些是较低级别的调用nullable,nonull只有在执行 C++ 操作(例如 typedef 和块)时才需要调用。

实际上,您根本不必使用nonnull其中任何一个。我通常使用的唯一标识符是nullable。原因是您应该NS_ASSUME_NONNULL_BEGIN/NS_ASSUME_NONNULL_END在 ObjC 代码中使用包装器,不仅是为了可读性,而且是为了更详细的编译器警告/错误和更好的 Swift 互操作性。

建议编写与此类似的 ObjC 类:

// SomeClass.h

NS_ASSUME_NONNULL_BEGIN
@interface SomeClass : NSObject
-(instancetype)initWithRequiredSomething:(NSString *)requiredString optionalSomething:(nullable NSString *)optionalString;
@end
NS_ASSUME_NONNULL_END
Run Code Online (Sandbox Code Playgroud)

返回值 和requiredString都是隐式nonnull的optionalStringnullable

尝试检查您的项目并删除_Nullable、_Nonnull和的所有实例nonnull,您可能会发现它非常令人满意(并希望解决问题!)。