Computer >> 컴퓨터 >  >> 스마트폰 >> iPhone

Swift에서 Generics와 Any 유형의 차이점을 분석해 보겠습니다.

Swift는 오늘날 가장 유형이 안전한 언어 중 하나입니다. ???

오, 잠깐만!! 언어가 유형 안전하다는 것은 무엇을 의미합니까? ?

유형 안전 언어는 항상 해당 시점에서 사용 가능한 올바른 종류의 데이터로 작업이 작동하도록 합니다.✓

언어가 다른 데이터 유형(예:Int, Float, String, Array, Dictionary)을 선언하는 기능이 있고 특정 데이터 유형으로 선언된 변수가 다른 유형의 데이터를 입력하면 유형이 안전한 언어라고 합니다.

유형 안전 언어에서 유형 검사는 항상 수행됩니다. 언어에 따라 컴파일 타임이나 런타임에 발생할 수 있습니다.✅

Swift에서 Generics란 무엇인가요?

제네릭은 유형이 안전하며 유연하고 재사용 가능한 함수 및 유형을 작성하는 데 도움이 됩니다. Generics를 사용하여 모든 데이터 유형에 대해 작동하는 코드를 작성할 수 있습니다. Swift는 유형이 안전한 언어이므로 이를 손상시키지 않고 코드 중복을 피할 수 있는 일반 코드를 작성할 수 있습니다.

간단한 예를 들어보겠습니다. 배열은 동일한 유형의 데이터를 보유할 수 있는 정렬된 컬렉션입니다. 이것이 배열의 정의에서 Element의 일반 유형을 취하는 것을 볼 수 있는 이유입니다. 따라서 배열은 일반 유형의 컬렉션이 됩니다. .

알겠습니다. 시원한. 그렇다면 Swift의 Any 유형은 무엇입니까? ???

Swift는 Any 유형도 지원합니다. 이름에서 알 수 있듯이 구조체, 클래스, 열거형 및 함수 유형과 같은 모든 유형의 인스턴스를 나타낼 수 있습니다.

Objective C id와 Swift의 Any는 동일한가요? ?

Swift 3에서 Objective C id type은 Swift의 Any 유형에 매핑됩니다. 이것은 Swift와 Objective C의 호환성을 향상시킵니다.

하지만 어떻게 그리고 왜??

Swift 2에서 Objective C id Swift의 Any 객체에 매핑되었습니다. 이것은 대부분의 경우에 잘 작동했지만 때로는 예기치 않은 동작이 발생했습니다. Swift의 핵심 개념 중 하나는 값 유형이며 이 매핑은 이 개념을 제대로 정의하지 못했습니다.

Swift는 iOS 개발을 위한 새로운 언어일 뿐이며 Objective C는 수년 동안 사용되어 왔습니다. 물론 대부분의 프로젝트는 Objective C로만 개발되었습니다. 이제 Objective 프로젝트를 Swift 프로젝트로 변환하려면 모든 Swift 유형을 Objective C 개체에 연결할 수 있어야 한다는 요구 사항이 있습니다.

그러나 이것은 이미 Objective C 대응물이 있기 때문에 Int, String, Float와 같은 Swift 클래스 및 Swift 값 유형에서는 문제가 되지 않았습니다. Objective C에 대응하는 항목이 없는 Swift 값 유형에서 문제가 발생했습니다.

따라서 이 문제를 해결하기 위해 Objective C id 유형이 Swift Any 유형에 매핑됩니다.✅✅✅

충분한 정의?. 이제 본론으로 들어가겠습니다. 위의 점으로 보면 Generics와 Any 타입이 같다고 볼 수 있습니다. 하지만 그들은 정말???

높은 수준에서 Any는 Generics와 유사하게 보일 수 있습니다. 하지만 몇 가지 차이점을 찾아보도록 하겠습니다-???

우리 모두는 스택 데이터 구조에 있습니까? 스택은 항목의 삽입 및 삭제가 한쪽 끝에서만 발생하는 기본 선형 데이터 구조입니다.

이제 우리는 Swift에서 스택 구조를 구현할 것입니다. 먼저 Generics를 사용하여 구현한 다음 Any 유형으로 구현합니다.

제네릭을 사용한 스택 구현:

위의 스택 구현은 Generics를 사용하고 있습니다. 구조체는 요소의 일반 유형을 사용합니다. 항목을 만들고 해당 항목을 사용하여 스택을 구현합니다. 이제 일반 스택으로 몇 가지 작업을 수행해 보겠습니다.

Integer 유형의 요소를 보유할 수 있는 Generic Stack을 선언합니다. 정수 요소를 스택에 푸시합니다. 지금까지는 모든 것이 잘 작동합니다.

하지만 float 요소를 genericStack 위의 요소로 푸시하려면 어떻게 해야 하나요?

Swift에서 Generics와 Any 유형의 차이점을 분석해 보겠습니다.

❌❌ 이런! 컴파일 오류! ❌❌

모든 유형을 사용한 스택 구현:

이 스택 구현에서 항목 배열은 모든 유형의 요소를 보유할 수 있습니다. items의 정확한 데이터 유형이 무엇인지 지정하지 않습니다. 정의의 배열 요소입니다. 이제 이 스택에서 동일한 기본 작업을 수행해 보겠습니다.

문제가 없습니까? 여기에서도 모든 것이 잘 작동합니다. 처음에는 스택을 선언하고 두 개의 정수 요소를 스택에 넣었습니다. show()를 호출할 때 메소드를 사용하면 정확한 배열 [3, 4]을 인쇄합니다.

이제 float 값을 입력해 보겠습니다.☄️

Swift에서 Generics와 Any 유형의 차이점을 분석해 보겠습니다.

✅✅ 오류 없음! 모든 것이 잘 작동합니다! ✅✅

뒤에서 벌어지는 일 ? 오류가 발생하지 않는 이유는 무엇입니까??? ?

제네릭은 기본적으로 컴파일러에 다음을 알려줍니다.

저는 제네릭 유형을 선언했으며 정확한 유형은 나중에 알려드리겠습니다. 내가 지정한 모든 곳에서 해당 유형을 적용하기를 바랍니다.

모든 유형은 기본적으로 컴파일러에게 다음을 알려줍니다.

이 변수에 대해 걱정하지 마십시오. 여기에 어떤 유형도 적용할 필요가 없습니다. 내가 하고 싶은 대로 할 수 있습니다.

제네릭을 사용하여 유연한 함수를 정의할 수 있지만 인수 유형은 여전히 ​​컴파일러에서 확인합니다. 모든 유형을 사용하여 Swift의 유형 시스템을 피할 수 있습니다.

일반 스택 선언에서 , 우리는 스택이 정수 유형만 취해야 한다고 컴파일러에 지시하고 있습니다. 그런 다음 float 유형의 요소를 삽입하려고 할 때 이는 우리가 그 약속을 어겼다는 것을 의미합니다. 따라서 컴파일 시간 오류가 발생합니다. 요소는 항상 정수 유형이어야 합니다.

그러나 모든 스택의 경우 , 컴파일 시간이나 런타임 오류가 발생하지 않습니다. show() 를 호출하더라도 메소드에서 스택을 [3, 4, 5.0] 으로 인쇄합니다. 이는 스택이 정수 및 부동 소수점 유형 값을 보유한다는 것을 의미합니다. 따라서 모든 스택에는 유형 제한이 없으며 모든 유형의 값을 스택에 넣을 수 있습니다(그러나 런타임 예외의 가능성이 있음).

결론

따라서 Generics를 사용하면 Swift의 유형 안전성을 손상시키지 않으면서 유연한 함수, 구조, 클래스 및 프로토콜을 작성할 수 있습니다. 그러나 Any 유형을 사용하면 일종의 보스가 되어 원하는 거의 모든 작업을 수행할 수 있습니다.

??? 건배!!! 읽어 주셔서 감사합니다!! ???