Swift의 AnyObject 및 Any


92

AnyObject를 언제 사용하고 언제 Any를 Swift에서 사용해야하는지 모르겠습니다.

제 경우에는 사전이 있습니다

[문자열 : ???]

??? : Int, Double, Float, String, Array, Dictionary가 될 수 있습니다.

누군가가 Any와 AnyObject의 차이점과 내 경우에 사용할 것을 설명해 줄 수 있습니까?

알락

답변:


116

AnyObject참조 유형 (클래스) 전용이며 Any값 및 참조 유형 모두를위한 것입니다.

그래서 당신은 [String: Any].

Any 및 AnyObject에 대한 유형 캐스팅

Swift는 비 특정 유형 작업을 위해 두 가지 특수 유형을 제공합니다.

  • Any 함수 유형을 포함하여 모든 유형의 인스턴스를 나타낼 수 있습니다.
  • AnyObject 모든 클래스 유형의 인스턴스를 나타낼 수 있습니다.

노트:

사용 AnyAnyObject단지 당신이 명시 적으로 제공하는 행동과 능력을 필요로 할 때. 코드에서 작업 할 것으로 예상되는 유형을 구체적으로 지정하는 것이 항상 좋습니다.

에서 스위프트 프로그래밍 언어 : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

또한 Cocoa API로 작업 할 때 AnyObject 배열을받는 것이 일반적입니다. 이는 Objective-C 배열이 유형화되지 않았기 때문입니다. 따라서 원하는 배열 유형으로 캐스트해야합니다.

-

편집 : (2015 년 12 월 22 일)
마지막 진술에서 이것이 Swift 2.0 및 Xcode 7에서 변경되고 있음을 유의하십시오.
Apple은 Objective-C에 'Lightweight'제네릭 을 도입 했으므로 이제 많은 Cocoa API가 이미 올바른 유형을 반환합니다.

편집 : (2016 년 10 월 18 일)
Swift 3.0부터 Objective-C id는 이제 Any더 이상 AnyObject.


18
그 주 String, Array그리고 Dictionary이 사용하는 모든를 들어, 클래스되지 않습니다.
zaph

6
Int, Double 및 Float도 마찬가지입니다.
Teejay

12
예,하지만 보통은 분명합니다. NSString, NSArray그리고 NSDictionary클래스 라는 것은 분명하지 않지만 비슷한 기능을하는 Swift 버전은 클래스가 아니고 많은 개발자를 방해합니다.
zaph

1
Any도 선택 사항을 나타 냅니까? 아니면 Any로 표현해야합니까?

1
@robdashnash Any는 선택 사항을 나타내지 않습니다. ? 선택 사항으로 만들기 위해 추가해야합니다.
crypt

47

사용 여부 Any또는 용도에 AnyObject따라 다릅니다.

당신의 사전은 스위프트 코드 내에서 사용되는 경우에, 당신은 사용해야 Any당신의 유형 (때문에 Int, Double, Float, String, Array,과 Dictionary)하지 않은 객체.

를 예상하는 Objective-C 루틴에 사전을 전달 NSDictionary하려면 AnyObject.

import Foundationimport UIKit또는 import Cocoa,이 같은 배열을 선언 할 수 [String: AnyObject]있지만,이 경우에는 스위프트가 치료되는 당신 Int, Double, Float리터럴로 NSNumber하여, StringS와 같은 NSString, 당신의 Array등의 NSArray, 그리고 당신의 사전 NSDictionary객체 모두. AnyObject값 유형으로 사용하는 사전 은로 변환 할 수 NSDictionary있지만 사용하는 사전 은 변환 할 수 Any없습니다.


1

Apple의 Swift 문서에 따르면

  • Any는 함수 유형 및 선택적 유형을 포함하여 모든 유형의 인스턴스를 나타낼 수 있습니다.
  • AnyObject는 모든 클래스 유형의 인스턴스를 나타낼 수 있습니다.

자세한 내용은 다음을 확인하십시오 : 블로그


1

이 대답을 확인하십시오 .

제네릭은 형식에 안전합니다. 즉, 문자열을 제네릭으로 전달하고 정수로 사용하려고하면 컴파일러가 불평하고 컴파일 할 수 없습니다 (좋은). (이는 Swift가 Static 타이핑을 사용하기 때문에 발생하며 컴파일러 오류를 제공 할 수 있습니다). AnyObject를 사용하는 경우 컴파일러는이 객체가 String 또는 Integer로 취급 될 수 있다는 것을 알지 못하며 기본적으로 기존 객체를 사용하려고하는 것처럼 원하는 작업을 수행 할 수 있습니다. Integer 일 때 문자열로 전달되면 응용 프로그램이 중단됩니다. (이는 Swift가 동적 타이핑을 사용하기 때문에 발생하며 런타임 오류 만 제공합니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.