source

스위프트에 있는 모든 물체와 모든 물체

lovecheck 2023. 8. 20. 11:55
반응형

스위프트에 있는 모든 물체와 모든 물체

언제 사용해야 할지 모르겠습니다.AnyObject할 때 및 할 때Any스위프트에서

저 같은 경우에는.Dictionary

[끈: ???]

: 될 수 있음Int,Double,Float,String,Array,Dictionary

누가 나에게 사이의 차이점을 설명해 줄 수 있습니까?Any그리고.AnyObject그리고 내 경우에 어떤 것을 사용해야 할지.

AnyObject 유형 기유표형(준)에만Any값 유형과 참조 유형 모두에 사용됩니다.

그래서 당신은 가야 합니다.[String: Any].

모든 객체 및 모든 객체에 대한 유형 주조

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로 작업할 때 Array of AnyObject를 수신하는 것이 일반적인데, 이는 Object-C 배열이 유형화되지 않았기 때문입니다.따라서 예상되는 어레이 유형에 맞게 캐스트해야 합니다.

-

편집: (2015년 12월 22일)
마지막 문장에서 이것은 Swift 2.0 및 Xcode 7과 함께 변경되고 있습니다.
Apple은 Objective-C에 'Lightweight' 제네릭을 도입하여 많은 코코아 API가 이미 올바른 유형을 반환합니다.

편집: (2016년 10월 18일)
3 Swift 3.0 기표목-Cid는 이제 이를 s 가니다져옵로으로 가져옵니다.Any는 더 이상 이아닌은더상AnyObject.

를 사용하는지 Any또는AnyObject사용 용도에 따라 달라집니다.

코드 된다면, 은 스위프트 의코사드사안용면다된만서합사,니다야용해다을음당만약신은을 사용해야 합니다.Any당신의 타입 때문에 (Int,Double,Float,String,Array,그리고.Dictionary는 개체가 .는 개체가 아닙니다.

, 이 은 ""-C"로 됩니다.NSDictionary그러면 당신은 사용해야 합니다.AnyObject.

이 신이당 때.import Foundation또는import UIKit또는import Cocoa을 배을다음같선수있습니다언으로 할 수 .[String: AnyObject]하지만 이 경우 스위프트는 당신을 치료하고 있습니다.Int,Double,Float로서의 리터럴.NSNumber,당신의.StringNSString,당신의.ArrayNSArray그리고 당신의 사전들이NSDictionary모든 것이 물체입니다.을 사용한 AnyObject이 값 을 로 변 수 있 므 으 로 할 환 유 형 ▁NSDictionary단 하나를 사용하여Any아닙니다.

Apple의 Swift 문서에 따르면,

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

자세한 내용은 블로그를 참조하십시오.

다음 SO 답변 확인:

제네릭은 유형이 안전합니다. 즉, 문자열을 제네릭으로 전달하고 정수로 사용하려고 하면 컴파일러가 불만을 제기하고 (좋은) 를 컴파일할 수 없습니다.(이는 Swift가 정적 타이핑을 사용하고 있으며 컴파일러 오류를 제공할 수 있기 때문에 발생합니다.)AnyObject를 사용하는 경우 컴파일러는 이 개체가 String 또는 Integer로 처리될 수 있으며 기본적으로 Integer일 때 String으로 전달된 개체를 사용하려고 하는 것처럼 사용자가 원하는 모든 것을 할 수 있도록 허용합니다(나쁜 경우).(Swift가 동적 타이핑을 사용하고 있으며 런타임 오류만 표시하기 때문에 이 문제가 발생합니다.)

기본적으로 "Any"를 사용해야 하며 좀 더 정확성이 필요한 경우 AnyHashable, AnyObject, AnyClass, Custom과 같은 제한된 유형을 선택할 수 있습니다.유형 등

UIKit 및 Foundation과 같이 Object-C로 작성된 프레임워크에 객체를 샌딩할 때 모든 Object를 사용해야 합니다.

AnyObject는 클래스 유형의 인스턴스를 허용하고 enum, struct 및 선택적 클래스 유형 개체와 같은 유형의 인스턴스는 허용되지 않습니다.

class CustomType {
   var instanceArg1: Int
   var instanceArg2: String
   static var classArg1: Int
}

AnyObject 유형의 특별한 점은 이 유형의 개체가 자동 완성을 통해 모든 @objc 메서드 및 변수에 액세스할 수 있다는 것입니다.UIKit 또는 Foundation을 가져오면 AnyObject 인스턴스 객체는 자동 완성을 통해 모든 Foundation 객체의 모든 변수 및 메서드에 액세스할 수 있습니다.

아래 코드는 지정된 인수가 UITableView가 아닌 String 유형이고 String 유형에 정의된 메서드 테이블View(_:numberOfRowsInSection)가 없기 때문에 먼저 런타임에서 앱을 컴파일하지만 충돌시킵니다.

import UIKit

class CustomType {

    func customMethod(arg1: AnyObject) {
        let tableView = UITableView()
        let numberOfRows = arg1.tableView(tableView, numberOfRowsInSection: 0)
    }
}

언급URL : https://stackoverflow.com/questions/25809168/anyobject-and-any-in-swift

반응형