AnyObject를 언제 사용하고 언제 Any를 Swift에서 사용해야하는지 모르겠습니다.
제 경우에는 사전이 있습니다
[문자열 : ???]
??? : Int, Double, Float, String, Array, Dictionary가 될 수 있습니다.
누군가가 Any와 AnyObject의 차이점과 내 경우에 사용할 것을 설명해 줄 수 있습니까?
알락
답변:
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
.
NSString
, NSArray
그리고 NSDictionary
클래스 라는 것은 분명하지 않지만 비슷한 기능을하는 Swift 버전은 클래스가 아니고 많은 개발자를 방해합니다.
사용 여부 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
하여, String
S와 같은 NSString
, 당신의 Array
등의 NSArray
, 그리고 당신의 사전 NSDictionary
객체 모두. AnyObject
값 유형으로 사용하는 사전 은로 변환 할 수 NSDictionary
있지만 사용하는 사전 은 변환 할 수 Any
없습니다.
제네릭은 형식에 안전합니다. 즉, 문자열을 제네릭으로 전달하고 정수로 사용하려고하면 컴파일러가 불평하고 컴파일 할 수 없습니다 (좋은). (이는 Swift가 Static 타이핑을 사용하기 때문에 발생하며 컴파일러 오류를 제공 할 수 있습니다). AnyObject를 사용하는 경우 컴파일러는이 객체가 String 또는 Integer로 취급 될 수 있다는 것을 알지 못하며 기본적으로 기존 객체를 사용하려고하는 것처럼 원하는 작업을 수행 할 수 있습니다. Integer 일 때 문자열로 전달되면 응용 프로그램이 중단됩니다. (이는 Swift가 동적 타이핑을 사용하기 때문에 발생하며 런타임 오류 만 제공합니다)
String
,Array
그리고Dictionary
이 사용하는 모든를 들어, 클래스되지 않습니다.