티스토리 뷰

Mobile/iOS

swift. Type matching - 3. Custom aka. ~=

out of coding 2019. 3. 23. 20:04

타입 매칭을 하는 경우에 enum 값을 이용하여서 범위내의 값을 구분할 수 있습니다.


다음과 같이 표현 가능합니다.


1
2
3
4
5
6
7
8
9
let point = (10)
switch point {
case (00):
    print("(0, 0)은 원점입니다. ")
case (-1...1-1...1):
    print("(\(point.0), \(point.1))은 거의 오차범위입니다.")
default:
    print("(\(point.0), \(point.1))은 오차를 벗어납니다.")
}
cs


값은 거의 오차범위입니다가 나올겁니다.


이것을 switch에서 사용할 수 있는 이유는 ~=를 사용하기 때문입니다.


~=는 범위내에 존재하는지를 판별하기 위한 연산자이며, 오버로딩이 가능한 타입입니다.


하고 싶은걸 해봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct Affine {
    var a: Int
    var b: Int
}
 
func ~= (lhs: Affine, rhs: Int-> Bool {
    let temp = rhs / lhs.a
    for number in 1...temp where number * lhs.a + lhs.b == rhs {
        return true
    }
    
    return false
}
 
switch 5 {
case Affine(a: 2, b: 0): print("Even number")
case Affine(a: 3, b: 1): print("3x+1")
case Affine(a: 3, b: 2): print("3x+2")
default: print("Other")
}
 
let result = Affine(a: 2, b: 2) ~= 4
print(result)
 
cs


이렇게 오버로딩을 하게 되면, Affine type에 대해서 처리를 할수 있게 됩니다.


switch를 설명을 하면 rhs로 들어오는 5의 값을 lhs값으로 비교를 하는것입니다.


아래쪽 print를 설명을 하자면 4가 1x+2 하게 되면서 true가 되게 됩니다.


응용하면 편하게 사용할 수 있는 부분들이 많습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함