Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Swift - проверить ноль развернутой дополнительной переменной

Автор вопроса: Shanmugaraja GОтветов: 2

У меня есть следующий класс модели, который находится в библиотеке, написанной на Objective-C. Я использую этот класс в своем быстром проекте. В Swift это становится свойством типа String!. Иногда это свойство будет нулевым. Итак, я проверяю нулевую проверку следующим образом:

Поставщик.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

Если бы свойства Objective-C отображались в Swift как String?, я бы использовал следующее:

if let middleName = anObject.middleName {

}

Как мне проверить развернутую необязательную переменную.

Заранее спасибо.

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

iosobjective-cswift3

Ответы

Ответ 1 · рейтинг 6 · Anil Varghese

Если вы хотите, чтобы свойство ObjectiveC отображалось в Swift как необязательное, отметьте его тегом _Nullable, например

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

Теперь имя middleName будет необязательным для типа String? вместо String!, и вы можете условно развернуть его.

Подробнее об обнулении в ObjC

Ответ 2 · рейтинг 2 · Julien Quere

Как упомянул Анил, лучшим решением было бы отредактировать код 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы