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
.
답변
사용 여부 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
없습니다.
답변
Apple의 Swift 문서에 따르면
- Any는 함수 유형 및 선택적 유형을 포함하여 모든 유형의 인스턴스를 나타낼 수 있습니다.
- AnyObject는 모든 클래스 유형의 인스턴스를 나타낼 수 있습니다.
자세한 내용은 다음을 확인하십시오 : 블로그
답변
제네릭은 형식에 안전합니다. 즉, 문자열을 제네릭으로 전달하고 정수로 사용하려고하면 컴파일러가 불평하고 컴파일 할 수 없습니다 (좋은). (이는 Swift가 Static 타이핑을 사용하기 때문에 발생하며 컴파일러 오류를 제공 할 수 있습니다). AnyObject를 사용하는 경우 컴파일러는이 객체가 String 또는 Integer로 취급 될 수 있다는 것을 알지 못하며 기본적으로 기존 객체를 사용하려고하는 것처럼 원하는 작업을 수행 할 수 있습니다. Integer 일 때 문자열로 전달되면 응용 프로그램이 중단됩니다. (이는 Swift가 동적 타이핑을 사용하기 때문에 발생하며 런타임 오류 만 제공합니다)