πŸ§ν•™μŠ΅λ°°κ²½


SwiftUIλ₯Ό μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ some ViewλΌλŠ” λ°˜ν™˜ νƒ€μž…μ„ 많이 λ³΄κ²Œλœλ‹€. body의 λ°˜ν™˜ νƒ€μž…λ„ κ·Έλ ‡κ³  λ·°λ₯Ό λΆ„λ¦¬ν•΄μ„œ λ”°λ‘œ λ³€μˆ˜λ‘œ λ§Œλ“€ λ•Œλ„ νƒ€μž…μ„ some Viewλ₯Ό μ‚¬μš©ν•΄μ„œ λ°˜ν™˜ν•˜κ²Œ λœλ‹€.

λ‚˜λŠ” κ·Έ λ™μ•ˆ some이 호좜 μ‹œμ μ— νƒ€μž…μ΄ ν™•μ •λ˜μ–΄ κ³ μ •λœ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” ν‚€μ›Œλ“œλΌκ³  μƒκ°ν–ˆλ‹€. κ·ΈλŸ¬λ‹€κ°€ ν•˜λ‚˜μ˜ ν•¨μˆ˜μ—μ„œ λΆ„κΈ° μ²˜λ¦¬μ— 따라 μ—¬λŸ¬ μ’…λ₯˜μ˜ λ·° νƒ€μž…μ„ 리턴할 수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€ λ•Œ λ‹¨μˆœνžˆ some View둜 λ°˜ν™˜ν•΄μ£Όλ©΄ 리턴 νƒ€μž…μ—μ„œ λ¬Έμ œκ°€ 없을 거라고 μƒκ°ν–ˆλ‹€. ν•΄λ‹Ή μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

private func destinationView(type: ViewType) -> some View {
    switch type {
    case ViewType.original:
        AsyncImageView(imageViewModel: imageViewModel)
    case ViewType.first:
        ImageScrollView(imageViewModel: imageViewModel)
    case ViewType.second:
        ResizedImageView(imageViewModel: imageViewModel)
    case ViewType.third:
        ResizeInBgView(imageViewModel: imageViewModel)
    case ViewType.fourth:
        ThumbnailView(imageViewModel: imageViewModel)
    }
}

ν•˜μ§€λ§Œ μœ„μ™€ 같이 μž‘μ„±ν•˜λ©΄ 리턴 νƒ€μž…μ„ ν™•μ •ν•  수 μ—†λ‹€λŠ” 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. λ‚˜λŠ” κ·Έ λ™μ•ˆ some의 κ³ μ • νƒ€μž…μ΄ 호좜 μ‹œμ μ—μ„œ ν™•μ •λœλ‹€κ³  μƒκ°ν–ˆκΈ°μ— 였λ₯˜κ°€ λ‚˜λŠ” 원인을 μ•Œ 수 μ—†μ—ˆλ‹€. μ•Œκ³ λ³΄λ‹ˆ some의 νƒ€μž…μ€ 컴파일 κ³Όμ •μ—μ„œ 확정이 λœλ‹€κ³  ν•œλ‹€. κ·Έλž˜μ„œ μœ„μ™€ 같은 κ²½μš°μ—λŠ” 컴파일 κ³Όμ •μ—μ„œ κ³ μ • νƒ€μž…μ„ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ‚˜λŠ” 것이닀.

(μœ„μ˜ κ²½μš°μ—λŠ” @ViewBuilder λ₯Ό λΆ™μ—¬μ£ΌλŠ” κ²ƒμœΌλ‘œ ν•΄κ²°ν•  수 μžˆλ‹€.)

문제λ₯Ό ν•΄κ²°ν•˜κ³  λ³΄λ‹ˆ λͺ‡ κ°€μ§€ 의문점이 생겼닀.

  1. 컴파일 κ³Όμ •μ—μ„œ ꡬ체 νƒ€μž…μœΌλ‘œ κ³ μ •λœλ‹€λ©΄ μ• μ΄ˆμ— λ°˜ν™˜ νƒ€μž…μ„ ꡬ체 νƒ€μž…μœΌλ‘œ μ„€μ •ν•˜λŠ” 것과 무엇이 λ‹€λ₯Έμ§€?
  2. 자주 λ³΄μ΄λŠ” any와 some은 μ–΄λ–€ 관계인지?

κ·Έλž˜μ„œ ν•΄λ‹Ή κΆκΈˆμ¦μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ WWDC22 μ˜μƒκ³Ό λ‹€λ₯Έ λΈ”λ‘œκ·Έ 글듀을 λ³΄λ©΄μ„œ 곡뢀해봀닀.

πŸ“„Β μ»¨ν…μΈ 


someκ³Ό anyλŠ” ****μ œλ„ˆλ¦­κ³Ό ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ 자주 λ³΄κ²Œλ˜λŠ” μΉœκ΅¬λ“€μ΄λ‹€. λ‘˜ λ‹€ μΆ”μƒν™”λœ νƒ€μž…μ„ μ‚¬μš©ν•  λ•Œ μ μš©ν•˜λŠ” ν‚€μ›Œλ“œλ“€μ΄λ‹€.

κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•˜μžλ©΄ some은 컴파일 κ³Όμ •μ—μ„œ 단일 κ³ μ • νƒ€μž…μ„ μš”κ΅¬ν•˜κ³  anyλŠ” λͺ¨λ“  νƒ€μž…μ„ μˆ˜μš©ν•  수 μžˆλŠ” μΆ”μƒν™”λœ ν˜•μ‹μ΄λ‹€. some은 νƒ€μž…μ„ μ œν•œμ‹œν‚€λŠ” λŠλ‚Œμ΄κ³  anyλŠ” λ°˜λŒ€λ‘œ μΆ”μƒν™”μ‹œμΌœμ„œ μ‚¬μš©ν•  수 μžˆλŠ” λŠλ‚Œμ΄λ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œλ‘œ κ°„λ‹¨ν•˜κ²Œ ν™•μΈν•΄λ³΄μž

protocol Shape {
    var angleCount: Int { get }
}

struct CircleShape: Shape {
    var angleCount: Int = 0
}

struct TriangleShape: Shape {
    var angleCount: Int = 3
}

struct RectangleShape: Shape {
    var angleCount: Int = 4
}

//anyShapesλŠ” 였λ₯˜κ°€ λ‚˜μ§€ μ•Šμ§€λ§Œ someShapeλŠ” 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
var anyShapes: [any Shape] = [CircleShape(), TriangleShape(), RectangleShape()]
var someShapes: [some Shape] = [CircleShape(), TriangleShape(), RectangleShape()]

μœ„μ˜ μ½”λ“œλŠ” 원, μ‚Όκ°ν˜•, μ‚¬κ°ν˜•μ„ ShapeλΌλŠ” ν”„λ‘œν† μ½œμ„ μ΄μš©ν•΄ μΆ”μƒν™”ν•˜κ³  이λ₯Ό 두 개의 배열에 λ‹΄κ³  μžˆλ‹€. ν•˜λ‚˜λŠ” any Shapeλ₯Ό λ°›κ³  ν•˜λ‚˜λŠ” some Shapeλ₯Ό λ°›λŠ”λ‹€. λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ anyλŠ” μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜μ§€λ§Œ some의 경우 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μ΄λŠ” some Shapeκ°€ ν•˜λ‚˜μ˜ 단일 νƒ€μž…μ„ μΆ”λ‘ ν•΄μ•Ό ν•˜λŠ”λ° Shapeλ₯Ό μ±„νƒν•˜λŠ” μ—¬λŸ¬ νƒ€μž…λ“€μ΄ 배열에 μžˆμ–΄ 단일 νƒ€μž…μ„ μΆ”λ‘ ν•˜μ§€ λͺ»ν•΄ μƒκΈ°λŠ” μ—λŸ¬μ΄λ‹€.

μΆ”κ°€μ μœΌλ‘œ WWDC22에 λ‚˜μ™”λ˜ μ˜ˆμ‹œλ₯Ό 보도둝 ν•˜μž