繁体   English   中英

Swift - 检查一个未包装的可选变量的nil

[英]Swift - Check nil of an unwrapped optional variable

我有一个如下的模型类,它位于用Objective-C编写的库中。 我正在快速的项目中使用这个类。 在swift中它变成String!类型的属性String! 有时该财产将是零。 所以,我正在测试nil验证如下:

Vendor.h

@interface Vendor: NSObject {

@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *middleName;
}

在我的Swift项目中,我正在检查middleName属性的nil验证,如下所示:

if anObject.middleNam != nil { // Here, It throws runtime error: fatal error: Unexpectedly found nil while unwrapping an Optional value
}

它抛出了以下运行时错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

如果Objective-C属性在swift中暴露为String? 然后我会使用以下内容:

if let middleName = anObject.middleName {

}

我如何检查未包装的可选变量。

提前致谢。

如果您希望ObjectiveC属性在Swift中作为可选项公开,请使用_Nullable标记来标记它

@property (nonatomic, strong) NSString * _Nullable middleName;

现在middleName name是String?类型的可选项String? 而不是String! 你可以有条不紊地打开它。

阅读更多关于ObjC中的Nullability的信息

正如Anil所提到的,最好的解决方案是编辑你的objective-c代码以添加一些_Nullable 但是,据我所知,您的Objective-C代码是一个无法编辑的库。 所以,你必须处理这些String! 这可能是nil

但你可以简单地使用if let技术:

if let firstName = vendor.firstName {
    print("Here is my firstName: \(firstName)")
} else {
    print("I have no firstName")
}
if let middleName = vendor.middleName {
    print("Here is my middleName: \(middleName)")
} else {
    print("I have no middleName")
}

if let lastName = vendor.lastName {
    print("Here is my name: \(lastName)")
} else {
    print("I have no lastName")
}

使用此Vendor代码,它返回以下结果:

@interface Vendor: NSObject
    @property (nonatomic, strong) NSString *firstName;
    @property (nonatomic, strong) NSString *lastName;
    @property (nonatomic, strong) NSString *middleName;
@end
@implementation Vendor
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.firstName = @"Julien";
        self.middleName = nil;
        self.lastName = @"Quere";
    }

    return self;
}
@end

结果:

Here is my firstName: Julien 
I have no middleName 
Here is my name: Quere

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM