我有一个带有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)
}
}
}
此文件由Xcode从swift的类生成。我看到_Nunnull修饰符,但XCode抱怨我应该添加该修饰符
。也许我忘记了项目配置中的某些设置。
我该如何解决这种奇怪的行为?
UPD
我在Swift 5和Xcode 10.2中遇到相同的问题。
很奇怪,因为我项目中的其他文件都以正确的方式处理。
仅_Nonnull
和_Nullable
修饰符有问题。 Xcode会忽略它们,如果我在警告消息中按按钮Fix
,Xcode会在指针上添加第二个修饰符,并且警告不会消失。
答案 0 :(得分:0)
在纯ObjC中,您实际上不需要使用_Nullable
和_Nonnull
。这些比nullable
和nonull
更低的杠杆调用,只有在做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
,而optionalString
是nullable
尝试遍历您的项目并删除_Nullable
,_Nonnull
和nonnull
的所有实例,您可能会发现它非常令人满意(并有望解决此问题!)。