Swift - 检查未包装的可选变量的 nil
Swift - Check nil of an unwrapped optional variable
我有一个模型 class 如下,它在用 Objective-C 编写的库中。我在我的 swift 项目中使用了这个 class。在 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 {
}
我将如何检查展开的可选变量。
提前致谢。
如果您希望 ObjectiveC 属性 在 Swift 中公开为可选,请使用 _Nullable 标记将其标记为
@property (nonatomic, strong) NSString * _Nullable middleName;
现在 middleName 名称将是可选类型 String?
而不是 String!
并且您可以有条件地解包它。
阅读更多关于 Nullability in ObjC
正如 Anil 所提到的,最好的解决方案是编辑您的 objective-c 代码以添加一些 _Nullable
。但是,据我了解,您的 Objective-C 代码是一个您无法编辑的库。所以,你要处理这些可以nil
的String!
。
但是你可以像这样简单地使用 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
代码,returns 得到以下结果:
@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
我有一个模型 class 如下,它在用 Objective-C 编写的库中。我在我的 swift 项目中使用了这个 class。在 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 {
}
我将如何检查展开的可选变量。
提前致谢。
如果您希望 ObjectiveC 属性 在 Swift 中公开为可选,请使用 _Nullable 标记将其标记为
@property (nonatomic, strong) NSString * _Nullable middleName;
现在 middleName 名称将是可选类型 String?
而不是 String!
并且您可以有条件地解包它。
阅读更多关于 Nullability in ObjC
正如 Anil 所提到的,最好的解决方案是编辑您的 objective-c 代码以添加一些 _Nullable
。但是,据我了解,您的 Objective-C 代码是一个您无法编辑的库。所以,你要处理这些可以nil
的String!
。
但是你可以像这样简单地使用 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
代码,returns 得到以下结果:
@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