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 모든 클래스 유형의 인스턴스를 나타낼 수 있습니다.

노트:

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

에서 스위프트 프로그래밍 언어 : 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 Foundation나 import 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.