Xcode 6 Beta 4를 사용하고 있습니다. 옵션을 적절히 테스트하는 방법을 알 수없는 이상한 상황이 있습니다.
선택적 xyz가있는 경우 올바른 테스트 방법입니다.
if (xyz) // Do something
또는
if (xyz != nil) // Do something
문서는 첫 번째 방법으로 수행한다고 말하지만 때로는 두 번째 방법이 필요하며 컴파일러 오류를 생성하지 않지만 두 번째 방법은 컴파일러 오류를 생성한다는 것을 알았습니다.
내 구체적인 예는 신속하게 연결된 GData XML 파서를 사용하는 것입니다.
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
내가 방금 한 경우 여기 :
if xmlError
항상 true를 반환합니다. 그러나 내가 할 경우 :
if (xmlError != nil)
그런 다음 (Objective-C에서 작동하는 방식으로) 작동합니다.
GData XML과 누락 된 옵션을 처리하는 방식이 있습니까?
답변
Xcode Beta 5에서는 더 이상 할 수 없습니다.
var xyz : NSString?
if xyz {
// Do something using `xyz`.
}
오류가 발생합니다.
프로토콜 ‘BooleanType.Protocol’을 준수하지 않습니다
다음 형식 중 하나를 사용해야합니다.
if xyz != nil {
// Do something using `xyz`.
}
if let xy = xyz {
// Do something using `xy`.
}
답변
if
조건 내에서 다른 이름의 변수를 할당하는 대신 다른 답변에 추가하려면 다음을 수행하십시오 .
var a: Int? = 5
if let b = a {
// do something
}
다음과 같은 변수 이름을 재사용 할 수 있습니다.
var a: Int? = 5
if let a = a {
// do something
}
이렇게하면 소재 변수 이름이 부족 해지는 것을 피할 수 있습니다 …
이것은 Swift에서 지원되는 가변 그림자 를 활용 합니다.
답변
옵션을 사용하는 가장 직접적인 방법 중 하나는 다음과 같습니다.
예를 들어 xyz
, 선택 유형 이라고 가정하십시오 Int?
.
if let possXYZ = xyz {
// do something with possXYZ (the unwrapped value of xyz)
} else {
// do something now that we know xyz is .None
}
이 방법 xyz
으로 값 이 포함되어 있는지 테스트 하고 있으면 해당 값으로 즉시 작업 할 수 있습니다.
컴파일러 오류와 관련하여 유형 UInt8
은 선택 사항이 아니므로 ( ‘no’는 아님) 주로 변환 할 수 없습니다 nil
. 작업하는 변수가 선택 사항인지 확인한 후 변수로 취급하십시오.
답변
스위프트 3.0, 4.0
nil에 대한 선택 사항을 확인하는 방법은 주로 두 가지가 있습니다. 다음은 이들을 비교 한 예입니다.
1.하자면
if let
nil에 대한 선택적을 확인하는 가장 기본적인 방법입니다. 다른 조건은이 nil 확인에 쉼표로 구분하여 추가 할 수 있습니다. 다음 조건으로 이동하려면 변수가 0이 아니어야합니다. 무 검사 만 필요한 경우 다음 코드에서 추가 조건을 제거하십시오.
그 외에는, x
nil이 아닌 경우 if 클로저가 실행되어 x_val
내부에서 사용 가능합니다. 그렇지 않으면 else 클로저가 트리거됩니다.
if let x_val = x, x_val > 5 {
//x_val available on this scope
} else {
}
2. 경비하자
guard let
비슷한 일을 할 수 있습니다. 주요 목적은 논리적으로 합리적으로 만드는 것입니다. 그것은 말처럼 반드시 변수가 전무, 그렇지 않으면 기능이 정지되지 않았는지 확인을 . guard let
추가 조건 검사를 할 수도 있습니다if let
.
차이점은 guard let
아래 설명과 같이 래핑되지 않은 값을와 동일한 범위에서 사용할 수 있다는 것 입니다. 이것은 또한에 의해, 다른 폐쇄에, 프로그램은 현재 범위를 종료해야한다는 점에 이르게 return
, break
등
guard let x_val = x, x_val > 5 else {
return
}
//x_val available on this scope
답변
신속한 프로그래밍 가이드에서
명령문 및 강제 언 래핑
if 문을 사용하여 선택적에 값이 포함되어 있는지 확인할 수 있습니다. 선택 사항에 값이 있으면 true로 평가됩니다. 값이 전혀 없으면 false로 평가됩니다.
가장 좋은 방법은
// swift > 3
if xyz != nil {}
xyz
in if 문을 사용하는 경우 xyz
상수 변수에서 if 문을 줄 바꿈 할 수 있으므로 if 문 xyz
이 사용되는 곳에서 모든 위치를 줄 바꿈 할 필요가 없습니다 .
if let yourConstant = xyz{
//use youtConstant you do not need to unwrap `xyz`
}
이 컨벤션이 제안 apple
하고 개발자들에게 이어질 것입니다.
답변
선택적을 명시 적으로 비교 nil
하거나 선택적 바인딩을 사용하여 값을 추가로 추출 해야하지만 (예를 들어 선택적이 부울 값으로 암시 적으로 변환되지 않음) Swift 2는 운명 의 피라미드를 피하기 위해 guard
명령문 을 추가했음을 주목할 가치가 있습니다. 작업 할 때 여러 개의 선택적 값이 있습니다.
다시 말해, 옵션에는 다음을 명시 적으로 확인하는 것이 포함됩니다 nil
.
if xyz != nil {
// Do something with xyz
}
선택적 바인딩 :
if let xyz = xyz {
// Do something with xyz
// (Note that we can reuse the same variable name)
}
그리고 guard
진술 :
guard let xyz = xyz else {
// Handle failure and then exit this code block
// e.g. by calling return, break, continue, or throw
return
}
// Do something with xyz, which is now guaranteed to be non-nil
두 개 이상의 선택적 값이있을 때 일반적인 선택적 바인딩이 어떻게 들여 쓰기가 커질 수 있는지 확인하십시오.
if let abc = abc {
if let xyz = xyz {
// Do something with abc and xyz
}
}
guard
명령문 으로이 중첩을 피할 수 있습니다 .
guard let abc = abc else {
// Handle failure and then exit this code block
return
}
guard let xyz = xyz else {
// Handle failure and then exit this code block
return
}
// Do something with abc and xyz
답변
스위프트 5 프로토콜 확장
선택적인 nil check를 쉽게 인라인 할 수 있도록 프로토콜 확장을 사용하는 접근법이 있습니다.
import Foundation
public extension Optional {
var isNil: Bool {
guard case Optional.none = self else {
return false
}
return true
}
var isSome: Bool {
return !self.isNil
}
}
용법
var myValue: String?
if myValue.isNil {
// do something
}
if myValue.isSome {
// do something
}