Swift의 if 스테이트먼트 내에서 여러 개의 let-as 사용
사전에서 두 개의 값을 꺼내서 사용하기 전에 캐스팅하고 올바른 유형을 테스트해야 합니다.제가 생각해낸 건 다음과 같습니다.
var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]
if let latitudeDouble = latitude as? Double {
if let longitudeDouble = longitude as? Double {
// do stuff here
}
}
하지만 나는 만약 질의를 한다면 그 두 가지를 하나로 묶고 싶다.그래서 다음과 같은 일이 일어나게다가,
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
그 구문이 통하지 않기 때문에, 뭔가 아름다운 방법이 없을까 생각하고 있습니다.
Swift 3 업데이트:
다음은 Swift 3에서 작동합니다.
if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
// latitudeDouble and longitudeDouble are non-optional in here
}
시도된 옵션바인딩 중 하나가 실패했을 경우 내부 코드가if-let
블록이 실행되지 않습니다.
주의: 모든 절이 'let' 절일 필요는 없습니다.콤마로 구분된 일련의 부울 체크를 사용할 수 있습니다.
예를 들어 다음과 같습니다.
if let latitudeDouble = latitude as? Double, importantThing == true {
// latitudeDouble is non-optional in here and importantThing is true
}
Swift 1.2:
Swift 1.2(오늘 베타판)에서 원하는 코드가 올바르게 컴파일되어 있기 때문에 Apple이 질문을 읽었을 수 있습니다.
if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
// do stuff here
}
Swift 1.1 이전 버전:
여기 좋은 소식이 있어요. 당신은 완전히 할 수 있어요.2개의 값의 태플에 있는 switch 문은 패턴 매칭을 사용하여 두 값을 모두 캐스트할 수 있습니다.Double
동시에:
var latitude: Any! = imageDictionary["latitude"]
var longitude: Any! = imageDictionary["longitude"]
switch (latitude, longitude) {
case let (lat as Double, long as Double):
println("lat: \(lat), long: \(long)")
default:
println("Couldn't understand latitude or longitude as Double")
}
업데이트: 이 버전의 코드가 올바르게 동작하게 되었습니다.
Swift 3에서는 옵션 체인, 스위치 스테이트먼트 또는 옵션 패턴을 사용하여 문제를 해결할 수 있습니다.
1. 사용방법if let
(옵션 바인딩/옵션 체인)
Swift Programming Language는 옵션 체인에 대해 다음과 같이 기술합니다.
여러 쿼리를 체인으로 연결할 수 있으며 체인 내의 링크가 제로일 경우 체인 전체가 정상적으로 실패합니다.
따라서 가장 간단한 경우 다음 패턴을 사용하여 옵션 체인 작업에서 여러 쿼리를 사용할 수 있습니다.
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if let latitude = latitude as? Double, let longitude = longitude as? Double {
print(latitude, longitude)
}
// prints: 2.0 10.0
2. 스위치 스테이트먼트에서의 튜플 및 값 바인딩 사용
단순한 옵션 체인의 대체 수단으로서 switch 문을 tuple 및 값바인딩과 함께 사용하면 세밀한 솔루션을 제공할 수 있습니다.
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude, longitude) {
case let (Optional.some(latitude as Double), Optional.some(longitude as Double)):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude, longitude) {
case let (latitude as Double, longitude as Double):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude as? Double, longitude as? Double) {
case let (.some(latitude), .some(longitude)):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
switch (latitude as? Double, longitude as? Double) {
case let (latitude?, longitude?):
print(latitude, longitude)
default:
break
}
// prints: 2.0 10.0
3. Tuples와 함께 사용if case
(옵션 패턴)
if case
(임의 패턴)을 사용하면 옵션의 열거 값을 쉽게 해제할 수 있습니다.여러 쿼리로 옵션 체인을 수행하기 위해 튜플과 함께 사용할 수 있습니다.
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (.some(latitude as Double), .some(longitude as Double)) = (latitude, longitude) {
print(latitude, longitude)
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (latitude as Double, longitude as Double) = (latitude, longitude) {
print(latitude, longitude)
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (.some(latitude), .some(longitude)) = (latitude as? Double, longitude as? Double) {
print(latitude, longitude)
}
// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]
if case let (latitude?, longitude?) = (latitude as? Double, longitude as? Double) {
print(latitude, longitude)
}
// prints: 2.0 10.0
Swift 3.0
if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
// do stuff here
}
언급URL : https://stackoverflow.com/questions/24592004/using-multiple-let-as-within-a-if-statement-in-swift
'programing' 카테고리의 다른 글
프로젝트별로 Git 구성을 다르게 할 수 있나요? (0) | 2023.04.17 |
---|---|
TextBox에서 Enter 키 (0) | 2023.04.17 |
'on error goto 0'과 'on error goto - 1'의 차이 -- VBA (0) | 2023.04.12 |
OS X Lion에서 단말기가 로드되지 않는 문제를 수정하는 방법 ~/.bashrc (0) | 2023.04.12 |
WPF 사이즈를 물리 픽셀로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.12 |