2016-06-28 3 views
6

Objective-C로 작성된 라이브러리에 다음과 같은 모델 클래스가 있습니다. 나는 신속한 프로젝트에서이 수업을 듣고있다. 신속하게 유형이 String! 인 재산이됩니다. 때때로 그 속성은 무효가됩니다. 다음과 같이 그래서,이 전무 검증 테스트입니다 :Swift - 래핑되지 않은 옵션 변수의 nil 확인

Vendor.h

@interface Vendor: NSObject { 

@property (nonatomic, strong) NSString *firstName; 
@property (nonatomic, strong) NSString *lastName; 
@property (nonatomic, strong) NSString *middleName; 
} 

을 내 스위프트 프로젝트에서 I는 아래의 가운데 이름의 속성의 무기 호 유효성을 확인하고 있습니다 :

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

if let middleName = anObject.middleName { 

} 

가 어떻게이 풀어 옵션 변수를 확인합니다 : String?로 wift 후 나는 다음과 같은 사용했을 것이다.

미리 감사드립니다.

+0

당신이 사용할 수있는이 Vendor 코드와

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") } 

, 그것은 다음과 같은 결과를 반환 암시 적으로 unwrapped 된 옵션을 가진'if let' -'! = nil' 체크가 prop 어쨌든'middleName'과 함께, anObject가 어떻게 정의 되었습니까? – Hamish

답변

5

당신은, 오브젝티브 -c 속성은 선택 사항으로 스위프트에 노출 될하려면 가운데 이름의 이름을 입력 String? 대신 String!의 선택이 될 것입니다 _Nullable 태그 이제

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

처럼 그것을 표시하고 당신은 조건을 풀다 수 .

보다 약 Nullability in ObjC

+0

OP의 속성이 옵션으로 Swift에 이미 노출되어 있습니다 (암시 적으로 적용 할 수 없음) & 조건부 래핑을 사용할 수 있습니다. Swift 3에서 암시 적으로 래핑되지 않은 옵션은 일반 옵션과 완전히 동일한 유형입니다. 특정 상황에서이를 강제로 해제 할 수있는 옵션이 있다는 것을 컴파일러에 알리는 속성 만 있습니다. 그리고 이러한 상황은'nil' 체크 나 조건 적 래핑을 포함하지 않습니다. OP의 코드가 잘 작동하고 있습니다. 문제는 anObject가 IUO로 정의되어 있고 이것이 풀려 있지 않은 것입니다. – Hamish

+0

obj-c 유형에 null 허용 태그를 추가하는 것이 좋은 방법인데, 특히 Swift와 상호 작용할 때는 특히 동의합니다. – Hamish

+0

@ originaluser2 귀하의 의견에 동의합니다.암시 적으로 unwrapped 옵션이 될 것이고, 여전히 조건부 언 래핑을 사용할 수 있습니다.하지만 컴파일러는 불평하지 않을 것입니다. 이렇게하면''let middleName : String = object.middleName'과 같은 상황에서 크래시가 발생할 것입니다. 따라서 nullable 태그로 표시하는 것이 좋습니다. 따라서 컴파일러 경고를 얻고 안전하게 처리 할 수 ​​있습니다. –

2

아닐 언급했듯이, 가장 좋은 방법은 몇 가지 _Nullable을 추가하는 당신의 목표 - C 코드를 편집하는 것입니다 읽어 보시기 바랍니다. 하지만, 내가 알기에, Objective-C 코드는 편집 할 수없는 라이브러리입니다. 따라서 String!을 처리해야합니다. nil 일 수 있습니다.

그러나 당신은 단순히 같은 if let 기술을 사용할 수 있습니다 :

@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 
관련 문제