English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 기사에서는 선택(Option)과 그 용례, Swift에서의 선택 처리를 배울 것입니다.
지난 기사에서는 Swift에서 사용할 수 있는 다양한 데이터 타입을 이해했으며, 이러한 타입 선언 변수나 상수가 기본 값을 포함하고 있다는 점에 주목했습니다.
예:
let someValue = Int() print(someValue)
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
0
하지만 Swift에는 또 다른 선택적인 데이터 타입이 있으며, 기본 값은 비어 있습니다(nil). 변수나 상수에 값을 할당하지 않고자 할 때, 선택을 사용할 수 있습니다. 선택 타입은 값을 가질 수도 있고 값을 가질 수 없습니다(비어 있는 값)
기술적으로, 이는 선택적인 신발 상자라고 생각할 수 있습니다. 신발 상자에 신발이 있을 수도 있고 없을 수도 있습니다. 따라서 신발을 꺼내려면 먼저 알아야 합니다.
데이터 타입을 간단히 Optional로 표현할 수 있습니다. 방법은 타입에 !나 ?를 추가하는 것입니다. 선택 변수에 값이 있으면 그 값을 Optional <Value>로 반환하고, 없으면 nil을 반환합니다
var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue)
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
nil nil
위의 프로그램에서는 ?와 !를 사용하여 선택 타입을 초기화했습니다. 두 가지 방법 모두 선택 타입을 생성할 수 있지만, 주요 차이점을 다음에 설명할 것입니다.
Int를 선언하는 경우, 이 변수는 정수 값을 가질 수도 있고 값을 가질 수 없습니다(nil). 변수에 어떤 값도 할당되지 않았기 때문에, 두 개의 print 문에서 nil을 출력할 수 있습니다
let someValue:Int? = 5 print(someValue) print(someValue!)
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
Optional(5) 5
위의 프로그램에서는 Optional Int 타입을 선언하고, 그 안에 값을 할당했습니다5。
Optional을 출력하는 경우 print(someValue)은 값을 반환하지 않습니다5그 대신 Optional(5)。 그것은 위에서 설명한 형식을 가지고 있습니다: Optional <Value>。 <Value>에 접근하기 위해, 우리는 풀리는(unwrap)이라는 이름의 방법이 필요합니다unwrapping)의 메커니즘을 통해
변수/상수의 끝에 문자 !를 추가하여 비밀지표 내용을 풀어서 다음과 같이 출력합니다 print(someValue!)。print(someValue!)는 비밀지표 내용을 풀어서 화면에 출력합니다 5。
하지만 기억해야 할 것은, 선택 사항에 접근할 때 항상 값이 있을 것이라고 확신할 때만 이 풀리는 메커니즘을 사용해야 합니다.
또한 다음과 같은 방식으로 풀린 비밀지표 내용을 생성할 수 있습니다:
let someValue:Int! = 5 print(someValue)
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
5
위의 프로그램에서 Int!는 비밀지표 내용을 생성하며, 이를 액세스할 때 자동으로 값을 풀어서 매번 ! 문자를 사용하지 않아도 됩니다.
이 선택 옵션을 사용할 때, 변수가 접근할 때 항상 값을 가지도록 확인하십시오. 그렇지 않으면 즉사적인 오류가 발생하는 충돌이 발생할 수 있습니다.
var someValue: Int! var unwrappedValue: Int = someValue //이 줄로 인해 충돌 발생
프로그램을 실행하면, 해제하는 중에 예기치 않게 발견된 nil을 해제하려고 시도했기 때문에 즉사적인 오류가 발생하는 충돌을 받게 됩니다: 코드 unwrappedValue: Int = someValue는 Optional someValue의 값을 변수 unwrappedValue에 할당하려고 시도합니다.
하지만, somevalue는 nil 값을 포함하는 선택 타입입니다. nil 값을 변수 unwrappedValue (이는 선택이 아닙니다)에 할당하려고 시도하면 충돌이 발생합니다.
이 상황을 처리하는 다른 방법을 설명하겠습니다.
선택 값을 사용하려면 해제해야 합니다. 선택 값을 사용하는 더 나은 방법은 ! 연산자를 사용한 강제 해제보다 조건 해제입니다.
이는 조건 해제를 요청하는 이유입니다.이 변수가 값이 있는지 확인하려고 합니까?값을 제공하면 됩니다. 그렇지 않으면 nil 상태를 처리합니다.
반대로 강제 해제는 이 변수가 사용될 때 실제로 값이 있다는 것을 나타냅니다. 따라서 nil 변수를 강제 해제할 때, 프로그램이 해제하는 중에 예기치 않게 발견된 nil을 해제하면 예외가 발생하고 프로그램이 충돌합니다. 조건 해제를 사용하는 몇 가지 기술을 설명합니다:
if 문을 사용하여 선택 파라미터가 값을 포함하는지 확인하고, 비교 연산자 "等于" 연산자 (==) 또는 "불等于" 연산자 (!=)를 사용할 수 있습니다.
var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil { print("값 포함\(someValue!)") } print("값을 포함하지 않음") } if someanotherValue != nil { print("값 포함\(someAnotherValue!)") } print("값을 포함하지 않음") }
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
값을 포함하지 않음 값 0을 포함
위 프로그램에서 선택 문이 값을 포함하면 if 문 내의 코드를 실행하고, 그렇지 않으면 else 블록 내의 문장을 실행합니다. 이 방법을 사용하여 선택 처리를 진행하는 주요 단점은 여전히 값을 해제할 때 ! 연산자를 사용해야 한다는 점입니다.
선택 바인딩은 선택 값이 값을 포함하는지 찾아내는 데 도움이 됩니다. 선택 값이 값을 포함하면, 이 값은 일시적인 상수나 변수로 사용될 수 있습니다. 따라서 선택 바인딩을 if 문과 함께 사용하여 선택 내부의 값을 확인하고 단일 작업에서 상수나 변수로 추출할 수 있습니다.
var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue { print("값 0을 포함 \(temp)") } print("값을 포함하지 않음") } if let temp = someAnotherValue { print("값 0을 포함 \(temp)") } print("값을 포함하지 않음") }
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
값을 포함하지 않음 값 0을 포함
위 프로그램에서 사항 문이 값이 포함되어 있다면 if 문 내의 코드를 실행합니다. 그렇지 않으면 else 블록이 실행됩니다. if-let 문은 자동으로 값을 해제하고 해제된 값을 temp 상수에 저장합니다. 이 메서드의 주요 장점은 사항 내용이 값이 포함되어 있다고 확신할 수 있지만 값을 강제로 해제할 필요가 없다는 것입니다.
Swift에서도 guard 문을 사용하여 사항 내용을 처리할 수 있습니다. guard에 대해 모르시면 걱정하지 마세요. 지금은 guard를 if로만 생각하세요.-else에 대한 if 방지 조건이 없습니다. 조건이 실패하면 else 문이 실행됩니다. 그렇지 않으면 다음 문장이 실행됩니다. 자세한 내용은 참조하세요Swift Guard。
func testFunction() { let someValue:Int? = 5 guard let temp = someValue else { return } print("It has some value \(temp)") } testFunction()
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
It has some value 5
위 프로그램에서 guard는 사항의 someValue가 값이 포함되어 있는지 확인하는 조건을 포함하고 있습니다. 그 값이 포함되어 있다면 guard-let 문은 자동으로 값을 해제하고 해제된 값을 temp 상수에 배치합니다. 그렇지 않으면 else 블록이 실행되고, 그 블록은 호출된 함수로 돌아갑니다. 사항이 값이 포함되어 있기 때문에 print 함수가 호출됩니다. 자세한 내용은 Swift guard을 참조하세요.
Swift에서는 사항 연산자 연산자를 사용하여 사항이 값이 포함되어 있는지 확인할 수 있습니다. 그것은 (a??b)로 정의됩니다. 그것은 사항 a를 펼쳐서 값이 포함되어 있다면 그 값을 반환하거나 a가 비어 있다면 기본 값 b를 반환합니다.
var someValue: Int! let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
5
위의 프로그램에서, 변수 someValue는 선택형으로 정의되었으며, nil 값이 포함되어 있습니다. 비어 있는 연산자는 선택형 값을 해제할 수 없으며, 따라서 defaultValue를 반환합니다. 따라서, print(unwrappedValue) 문장은 컨솔에서 출력됩니다.5。
var someValue: Int? = 10 let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
이 프로그램을 실행할 때, 출력은 다음과 같습니다:
10
하지만, 위의 프로그램에서, 선택형 변수 someValue는 값을 초기화되었습니다.10따라서, 비어 있는 연산자가 성공적으로 someValue 값을 해제했습니다. 따라서, 이 문장은 컨솔에서 someValue ?? defaultValue를 반환합니다.10print(unwrappedValue) 문장이 출력됩니다.10。