@ J. 비니의 대답은 당신의 첫 번째 질문을 멋지게 (그리고 설득력있게) 다룹니다. 처음 one
이 0
과 일치하지 않으므로 은 호출되지 않습니다. AND
은 단락되었습니다.
두 번째 질문은 튜플의 경우 ==
구현에 따라 달라집니다. a comment to this question에 따르면 2.2.1부터 Swift-language의 일부였으며 표준 구현은 단시간에 이루어 지므로 가장 빠른 작업입니다. 두 번째 경우에는 두 번째 요소가 비교되지 않습니다.
Btw : Swift switch
문에 break
을 입력 할 필요가 없으면 원하는 경우 fallthrough
이됩니다.
수정 : 내 생각에 절반 만 맞는 것으로 나타났습니다. switch
의 패턴 일치가 예상 한 것보다 많은 것으로 보입니다. 나는 내 자신의 Bool
열거 (약 this post 다음 (그리고 스위프트 3)에 대한 조정)을 사용하여 ==
를 납치 시도하고 몇 가지 놀라운 결과를 얻었다 :
이
import Cocoa
let one = 1
let two:MyBool = .myTrue
let three:MyBool = .myFalse
typealias ThreeTuple = (o:Int, tw:MyBool, th:MyBool)
let tuple:ThreeTuple
tuple = (one, two, three)
switch tuple {
case let (1, b, c) where b == c:
print("first case")
case (1, .myTrue, .myFalse):
print("second case")
default:
print("default")
}
enum MyBool : ExpressibleByBooleanLiteral, Equatable {
case myTrue, myFalse
public init() { self = .myFalse }
public init(booleanLiteral value: BooleanLiteralType) {
self=value ? .myTrue : .myFalse
}
}
func ==(lhs: MyBool, rhs: MyBool) -> Bool {
print("evaluate ==")
switch (lhs, rhs) {
case (.myTrue,.myTrue), (.myFalse,.myFalse):
return true
default:
return false
}
}
내가 majorly이었다 시점에서
evaluate ==
second case
를 산출 놀랐다. MyBool
값의 경우 ==
의 유일한 평가는 case
의 where b == c
절에서 발생하며 모든 비교 튜플은 MyBool
==
함수 을 전혀 사용하지 않습니다. !!나는 옵티마이 저는 컴파일시에 과도한 최적화를 배제해야 이는 func
func match(_ tuple:ThreeTuple) {
switch tuple {
case let (1, b, c) where b == c:
print("first case")
case (1, .myTrue, .myFalse):
print("second case")
default:
print("default")
}
}
로에
switch
살이 너무 방해했지만, 지금은
match((1, .myTrue, .myTrue))
match((1, .myTrue, .myFalse))
match((0, .myTrue, .myFalse))
를 요청할 때이
evaluate ==
first case
evaluate ==
second case
default
을 얻을 의심
여기서 evaluate ==
은 여전히 첫 번째 case
에서만 발생합니다. 그러므로 유일한 합리적인 결론은 switch
문에서 패턴 일치 중에 진행되는 "다른 마술"이있는 것으로 보입니다. 그게 뭔지 알아낼 수 있다면 구글로 가려고했지만 지금까지는 쓸모가 없습니다. 어떤 식 으로든, 길 내가 예상했던 것보다 더 단락이있는 것처럼 보입니다.
두 번째 case 문이 단락되었음을 증명하기 위해 코드를 작성하는 것이 좋습니다. 그걸하는 방법을 알아 낸다. –
@ J.beenie 당신 말이 맞습니다. 다른 어떤 일이있는 것 같습니다. 패턴 매칭은 Swift에서 * 실제로 최적화 된 것 같습니다. 이것에 관해 밝혀 줄 수있는 사람이 있는지 살펴 봅니다. – Patru