iOS/Swift Grammar

[Swift] 제네릭 대신 Any 타입을 사용하면 안될까 ?

kyxxn 2024. 2. 15. 14:43
728x90

결론

1. Int면 Int끼리, String이면 String끼리 교환하고 싶은데 제약을 못 걸어줌

2. Any로 매개변수를 받는다면, 전달인자에 Any로 전달되어야 함

3. Any 타입을 넣어 호출하는데, 이 순간 값이 복사되어 할당됨 (새 변수로만 함수를 호출한다는 뜻)

 

Any, AnyObject

스위프트에는 특정 타입을 지정하지 않고 여러 타입의 값을 할당할 수 있는 Any와 AnyObject라는 특별한 타입이 있다.
Any는 함수 타입을 포함한 모든 타입을 뜻하고, AnyObject는 클래스 타입만을 뜻한다.

제네릭 (Generic)

제네릭은 스위프트의 어떤 타입에도 유연하게 대응할 수 있으며 코드의 중복을 줄이는 기능이다.

[이전 글 참고]

https://kyxxn.tistory.com/39

 

[Swift] 제네릭 문법

제네릭 제네릭은 스위프트의 어떤 타입에도 유연하게 대응할 수 있으며 코드의 중복을 줄이는 기능이다. 또한, 제네릭으로 구현한 기능과 타입은 재사용에도 쉬우며 Array, Dictionary, Set 등의 타입

kyxxn.tistory.com

 

제네릭 대신 Any 타입을 사용하면 안될까 ?

func swapTwoValues(_ a: inout Any, _ b: inout Any) {
    let tmp: Any = a
    a = b
    b = tmp
}

var anyOne: Any = 1
var anyTwo: Any = "Two"

print("anyOne: \(anyOne) | anyTwo: \(anyTwo)")
swapTwoValues(&anyOne, &anyTwo)
print("anyOne: \(anyOne) | anyTwo: \(anyTwo)")
print()

var strOne: String = "A"
var strTwo: String = "B"

anyOne = strOne
anyTwo = strTwo

print("anyOne: \(anyOne) | anyTwo: \(anyTwo)")
swapTwoValues(&anyOne, &anyTwo)
print("변경 후 anyOne: \(anyOne) | anyTwo: \(anyTwo)")
print("변경 후 strOne: \(strOne) | strTwo: \(strTwo)")

swapTwoValues(&strOne, &strTwo) // 에러

 

Any 매개변수에는 Any 타입이 들어가야 한다.

"Inout argument could be set to a value with a type other than 'String'; use a value declared as type 'Any' instead"

String 타입이 들어가니 에러 뜸

 

결론 제네릭을 쓰자