[WWDC19] some

Table of contents

🎵가끔씩 나도 모르게 짜증이나~

너를 향한 이 맘은 변하지 않았는데 혹쒸~~ 내가 이상한걸까 🎶

내 이걸 아는 당신 그 Some이 맞습니다.

우리가 연애하는 썸만큼 달달하지 않지만 코딩할 땐 달달한 Swift의 some에 대해서 알아보자.


Some SwiftUI를 하다보면 굉장히 자주 볼 수 있음

var body: some View {
    /* Any View */
}

이렇게 되어있는 SwiftUI View들을!

모를 땐 뭐다? 공식 문서를 보자!

하지만 따따디씨 2019에서 새로 나온 개념이기에 도입된 배경까지 알 수 있으니 WWDC 2019를 보자!

WWDC 2019 - What's New in Swift

// Shapes Example
protocol Shape { /* ... */ }
struct Square: Shape { /* ... */ }
struct Circle: Shape { /* ... */ }
struct Oval: Shape { /* ... */ }
struct Union<A: Shape, B: Shape>: Shape { /* ... */ }
struct Transformed<S: Shape >: Shape { /* ... */ }
struct FaceShape {
    /* Something else */
    var shape: Shape { // ⬅️ Shape
        switch faceType {
        case .round:
            return Circle()
        case .square:
            return Square()
        case .diamond:
            return Transformed(Square(), by: .fortyFiveDegrees))
        default:
            return Oval()
        }
    }
}

자 여기서 <= Shape는 문제가 될까?

문제 없다. 반환되는 모든 값들이 Shape Protocol을 따르고 있기 때문이다.


자 그럼 Union을 통해서 새로운 도형을 만들어보자.

기존 사각형 + 45도 돌린 사각형을 Union 하여 8각이 있는 스타 Shape를 만들어보자.

struct EightPointedStar {
    …
    var shape: Union<Square, Transformed<Square>> {
        return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
    }
}

여기서 Shape 타입이 문제가 될까?

문제 없다. 코드상 문제는 없다.

다-만 사용자의 입장에서는 문제가 될 수 있다.

아 8개 각이 있는 스타 얻어야지!
EightPointStar 구조체 선언하고
shape 연산 프로퍼티를 사용하면 8개 각이 있는 별 모양의 shape가 나오겠지!

하지만 결과는 Union 타입.

사용하는 입장에서는 또 공부를 해야한다.

Shape처럼 작동하긴 하는데 Union은 또 뭔데??

💡
즉 사용자의 입장에서 불필요한 정보를 노출시켜서 API를 어렵게 만드는 것이다.

엥 그럼 그냥

struct EightPointedStar {
    …
    var shape: Shape {
        return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
    }
}

이렇게 코드 짜면 되는거 아님?

응 안돼!

왜??

  1. 프로토콜 타입이 return 된다면 같은 값을 return한다는 보장이 없다.

  2. 만약 같은 API에 각기 다르게 API를 호출했다면 같은 값이여야 함 -> 하지만 값 자체를 비교하지 못함 왜? 프로토콜 타입이니깐

짜잔!🎉 그래서 나온 타입이 some


some

위 예시에서 알 수 있듯이 some을 사용하는 이유는 다음과 같이 사용할 수 있다.

(함수)사용자 입장에서 불분명한 타입을 반환하여 내부구조로 어떤 것이 반환되는지 정확하게 알 수 없도록 하는 타입.

음 사용자에게 정확하게 알 수 없는게 과연 좋은걸까? 생각했음

근데 사용할 입장에서는 때론 정확하지 않은게 좋을 수 있음

왜???

struct EightPointedStar {
    …
    var shape: Union<Square, Transformed<Square>> {
        return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
    }
}

위 예시 처럼 some을 사용하지 않고 저렇게 Union을 반환시켜도 됨

하지만 저 Square가 아닌 Circle이 들어간다면? 저걸 다 하나 하나 다 선언해줘야함

struct EightPointedStar {
    …
    var shape: Union<Circle, Transformed<Square>> {
        return Union(Circle(), Transformed(Circle(), by: .fortyFiveDegrees))
    }
}

이렇게 이건 너무 불-편해

난 그저 Shape가 사용하고 싶을 뿐인데...

그래서 불분명한게 좋을 수 있는 거임

struct EightPointedStar {
    …
    var shape: some Shape {
        return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
    }
}

이러면 아무것도 묻지도 않고 따지지도 않고 Shape 사용 가능

타인이 '나를 어떻게 평가하는가'는 생각보다 중요하다 – 쪼박의 바이오테크 스타트업 이야기