2016-06-28 3 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; 
} 

В моем Swift проекта, я проверка всухую проверок для свойства 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

Вы можете использовать 'if let' с неявно развернутыми опциями - хотя проверка'! = nil' должна срабатывать с помощью 'middleName', как определяется' anObject'? – Hamish

ответ

5

Если вы хотите ObjectiveC недвижимость выставляться в Swift, как опция, отметьте его _Nullable тег как

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

Теперь имя MiddleName будет факультативным типа String? вместо String! и вы могли бы условно разворачивать его ,

Подробнее о Nullability in ObjC

+0

Обратите внимание, что свойство OP уже открыто в Swift как необязательное (оно просто неявно разворачивается), и он может использовать условную развертку на нем. В Swift 3 неявно развернутый необязательный тип того же типа, что и обычный необязательный - он просто имеет атрибут, сообщающий компилятору, что он имеет возможность принудительно разворачивать его в определенных ситуациях. И эти ситуации не включают проверки «nil» или условное разворачивание. Код 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 
Смежные вопросы