programing

Swift의 if 스테이트먼트 내에서 여러 개의 let-as 사용

skycolor 2023. 4. 17. 21:37
반응형

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

반응형