let f:() -> Void = { }
let array = ["a", 1, false, f] as [Any]
if array[3] is AnyObject {
print(array[3])
}
배열이 Any를 저장하도록 설정 되었어도 AnyObject에 대해 요소가 true로 평가되는 이유는 무엇입니까?모든 객체를 저장하는 배열도 AnyObject 유형입니다.
정의에 의한 AnyObject가 클래스 일 수는 있지만 함수가 AnyObject로서 true로 평가되는 이유는 무엇입니까? 다른 예로서
:let f:() -> Bool = { return true }
let ff = f as AnyObject
(ff as() -> Bool)()
이되었다는 내용의 API doc에 AnyObject의 정의에 반하는 :
AnyObject 어떤 인스턴스에 대한 구체적인 형태로 사용될 수있다 클래스, 클래스 유형 또는 클래스 전용 프로토콜 일 수 있습니다.
또는 공식 Swift Programming Language Guide :
모든 • 기능을 유형을 포함, 모든 모든 유형의 인스턴스를 나타낼 수 있습니다.
• AnyObject는 모든 클래스 유형의 인스턴스를 나타낼 수 있습니다.
위의 예에서 function은 AnyObject로 표현 될 수 있습니다.
SwiftValue 클래스가 사용 되었기 때문에 내부적으로 AnyObject에 브리징 할 수있는 SO의 설명이 있습니다 (@hamish가 지적한 바 있음). 설명의 논리는 구현이 부정확하거나 AnyObject 및 typecheck 연산자의 정의가 올바르지 않으므로 구현이 언어 정의에 따라야하며 그렇지 않은 경우가 아니라면 잘못되었거나 반대 일 것입니다.
* 모든 것이 * 연결 가능하기 때문에 3. [AnyObject가 Xcode8 beta6에서 작동하지 않습니까?] (http://stackoverflow.com/q/39033194/2976878) – Hamish
기능이 AnyObject에 연결될 수있는 이유는 무엇입니까? AnyObject의 정의를 깨뜨리지 않습니까? 가능한 경우에도이 동작은 잘못되었습니다. – Boon
링크 된 Q & A를 읽으십시오 - Obj-C와 직접적으로 호환되지 않는 것들은 Objc-C 호환 상자'_SwiftValue'에 상자가 있습니다. 이것에 대한 이유는'id'가 Swift에'Any'로 연결되어 있기 때문에'Any'는'id'로 연결될 수 있어야하기 때문입니다. – Hamish