我有一个如下的模型类,它位于用Objective-C编写的库中。我正在快速的项目中使用这个类。在swift中,它成为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 {
}
我如何检查未包装的可选变量。
提前致谢。
答案 0 :(得分:6)
如果您希望将ObjectiveC属性作为可选项在Swift中公开,请使用 _Nullable 标记标记
@property (nonatomic, strong) NSString * _Nullable middleName;
现在,middleName name可以是String?
类型的可选项,而不是String!
,您可以有条件地解包它。
答案 1 :(得分:2)
正如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