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

时间:2018-09-26 04:17:37

标签: objective-c swift xcode

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

enter image description here

标有错误的代码:

//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)
        }
    }
}

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

UPD
我在Swift 5和Xcode 10.2中遇到相同的问题。
很奇怪,因为我项目中的其他文件都以正确的方式处理。
_Nonnull_Nullable修饰符有问题。 Xcode会忽略它们,如果我在警告消息中按按钮Fix,Xcode会在指针上添加第二个修饰符,并且警告不会消失。

1 个答案:

答案 0 :(得分:0)

在纯ObjC中,您实际上不需要使用_Nullable_Nonnull。这些比nullablenonull更低的杠杆调用,只有在做C ++事情(如typedef和块)时才需要。

真的,您也不必使用nonnull。我通常使用的唯一标识符是nullable。这样做的原因是,您应该在ObjC代码中使用NS_ASSUME_NONNULL_BEGIN/NS_ASSUME_NONNULL_END包装器,不仅是为了提高可读性,而且是为了获得更详细的编译器警告/错误和更好的Swift互操作性。

建议编写类似于以下内容的ObjC类:

// SomeClass.h

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

返回值和requiredString都隐式为nonnull,而optionalStringnullable

尝试遍历您的项目并删除_Nullable_Nonnullnonnull的所有实例,您可能会发现它非常令人满意(并有望解决此问题!)。