HIT해

[Swift 기초문법 - 58] Any, AnyObject, some 본문

Swift/Swift 기초문법

[Swift 기초문법 - 58] Any, AnyObject, some

힛해 2024. 8. 19. 23:34
728x90

Any란?

Any는 모든 타입을 나타내는 Swift의 특별한 타입.

Int, String, Array와 같은기본 타입 뿐만 아니라 사용자 정의 타입, 클래스, 구조체, 열거형, 클로저

모든 타입을 변수나 상수에 담을 수 있다.

 

사용예시

var anyValue: Any = 42
anyValue = "Hello"
anyValue = [1, 2, 3]

 

  • 타입이 미리 정해지지 않았을 떄 Any를 사용할 수 있다.
  • Any를 사용하면 콜렉션에서 여러 타입을 다룰 때 즉 배열이나 딕셔너리에서 다양한 타입의 요소를 저장해야할 때 유용하다
let mixedArray: [Any] = [1, "Hello", true, 3.14]

 

주의사항

  • Any로 저장된 값은 구체적인 타입 정보를 잃게 되기에 값을 사용하려면 다운 캐스팅이 필요하다
  • 타입 안정성을 잃을 수 있으므로 남용하지 않는 것이 좋다.

 

 

AnyObject란?

AnyObject는 모든 클래스 타입을 나타내는 프로토콜이다.

Any는 모든 타입을 담을 수 있는 반명 AnyObject는 클래스 타입만을 담을 수 있다.

class MyClass {}

let object: AnyObject = MyClass()
  • 클래스 타입의 콜렉션 : 클래스 인스턴스만을 포함하는 배열이나 딕셔너리에서 유용하다.
  • AnyObject는 Object-C의 id 타입과 유사하며 Object-C 코드와 상호 운용할때 자주 사용된다
let classArray: [AnyObject] = [MyClass(), NSString(), NSNumber(value: 42)]

 

주의사항

AnyObject 또한 타입 정보가 손실되므로 사용할 때는 다운 캐스팅이 필요하다.

 

Some이란?

Swift 5.1에서 도입된 some 키워드는 불투명한 반환 타입을 나타낸다.

이는 특정 프로토콜을 따르는 어떤 타입을 반환할 것이라고 명시하지만 구체적인 타입은 숨길 수 있다.

 

protocol Shape {
    func area() -> Double
}

struct Circle: Shape {
    var radius: Double
    func area() -> Double {
        return .pi * radius * radius
    }
}

func makeCircle() -> some Shape {
    return Circle(radius: 5)
}

 

  • 구체적인 타입을 숨기고 싶을 때 유용하다 : API의 구현 세부 사항을 감추고 호출자가 타입에 의존하지 않도록 할 수 있다.
  • 유연한 함수 구현 : 함수가 반환하는 타입이 고정되지 않고 유연하게 변화할 수 있을 때 유용하다.

주의사항

  • some 키워드는 반환되는 타입이 단일 타입임을 보장해야한다. 함수의 호출마다 다른 타입을 반환할수는 없다!
  • some은 프로토콜을 반환할 때만 사용할 수 있으며, 일반 타입에는 사용할 수 없다.