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 { 

} 

我怎么会检查展开的可选变量。

在此先感谢。

+0

您可以使用'如果让'隐含地解开可选项 - 尽管'!= nil'检查应该可以工作用'middleName'恰当地,'anObject'是如何定义的? – Hamish

如果你想在斯威夫特为可选暴露的ObjectiveC财产,与_Nullable标签像

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

现在中间名的名称将是可选的String?,而不是String!类型的标记它,你可以有条件地解开它。

了解更多关于Nullability in ObjC

+0

请注意,OP的属性已经在Swift中作为一个可选项(它隐式地不可打包)暴露,他可以使用条件解包。在Swift 3中,隐式解包的可选类型与常规可选类型完全相同 - 它只是有一个属性,告诉编译器它可以选择在某些情况下强制解包它。而这些情况不包括'无'检查或有条件的解包。 OP的代码对我来说工作正常 - 我怀疑他的问题是'anObject'被定义为IUO,这就是解压缩的问题。 – Hamish

+0

虽然我绝对同意将obj-c类型添加为空的标签是一个很好的选择,尤其是在与Swift交互时。 – Hamish

+0

@ 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