2016-06-28 146 views
6

我有一個模型類,如下所示,它是在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

回答

5

如果你想在斯威夫特爲可選暴露的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'的情況下導致崩潰。因此,使用可空標記進行標記是一種很好的做法,因此誰將會使用它會得到編譯器警告,並且他可以安全地處理它。 –

2

正如阿尼爾提到的,最好的辦法是編輯您的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