Swift - 检查零解包可选变量
我有一个模型类,如下所示,它是在Objective-C编写的库中。我在我的快速项目中正在使用这个课程。在迅速它变成String!
类型的财产。有时候这个财产将是零。所以,我测试零验证如下:Swift - 检查零解包可选变量
Vendor.h
@interface Vendor: NSObject {
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *middleName;
}
在我斯威夫特的项目,我检查无验证的中间名属性如下:
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
如果客观C属性暴露在s wift为String?
话,我会用以下内容:
if let middleName = anObject.middleName {
}
我怎么会检查展开的可选变量。
在此先感谢。
如果你想在斯威夫特为可选暴露的ObjectiveC财产,与_Nullable标签像
@property (nonatomic, strong) NSString * _Nullable middleName;
现在中间名的名称将是可选的String?
,而不是String!
类型的标记它,你可以有条件地解开它。
了解更多关于Nullability in ObjC
请注意,OP的属性已经在Swift中作为一个可选项(它隐式地不可打包)暴露,他可以使用条件解包。在Swift 3中,隐式解包的可选类型与常规可选类型完全相同 - 它只是有一个属性,告诉编译器它可以选择在某些情况下强制解包它。而这些情况不包括'无'检查或有条件的解包。 OP的代码对我来说工作正常 - 我怀疑他的问题是'anObject'被定义为IUO,这就是解压缩的问题。 – Hamish
虽然我绝对同意将obj-c类型添加为空的标签是一个很好的选择,尤其是在与Swift交互时。 – Hamish
@ originaluser2我同意你的观点。它将被隐式解包为可选项,并且他仍然可以对其使用条件解包,但是如果您不这样做,编译器就不会抱怨,并且这会在诸如'let middleName:String = object.middleName'的情况下导致崩溃。因此,使用可空标记进行标记是一种很好的做法,因此谁将会使用它会得到编译器警告,并且他可以安全地处理它。 –
正如阿尼尔提到的,最好的办法是编辑您的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
您可以使用'如果让'隐含地解开可选项 - 尽管'!= nil'检查应该可以工作用'middleName'恰当地,'anObject'是如何定义的? – Hamish