Swift에서 변수의 유형 또는 클래스를 어떻게 인쇄합니까?


335

변수의 런타임 유형을 신속하게 인쇄하는 방법이 있습니까? 예를 들면 다음과 같습니다.

var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)

println("\(now.dynamicType)") 
// Prints "(Metatype)"

println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector

println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method

위의 예에서 변수 "soon"이 유형 ImplicitlyUnwrappedOptional<NSDate>이거나 적어도 임을 보여주는 방법을 찾고 NSDate!있습니다.


43
@JasonMArcher 연결 한 질문이 4 일 후에 질문 한 경우 어떻게 중복됩니까?
akashivskyy 2016 년

Swift 객체의 유형을 테스트하거나 Swift 객체의 유형을 읽는 방법에 대한 여러 가지 질문이 있습니다. 우리는이 주제에 대한 "마스터"질문으로 사용할 최상의 질문을 찾고 있습니다. 제안 된 사본에는 훨씬 더 철저한 답변이 있습니다. 이것은 당신이 무언가 잘못했다고 말하는 것이 아니라, 우리가 혼란을 줄이기 위해 노력하고 있다는 것입니다.
JasonMArcher 2016 년

4
제안 된 사본은 동일한 질문에 대답하지 않습니다. Type.self는 디버깅 목적으로 콘솔에 인쇄 할 수 없으며 Types를 객체로 사용하는 다른 함수에 전달하는 데 사용됩니다.
Matt Bridges

2
OT : Swift가 즉시 그것을 제공하지 않으며 그러한 저수준 C 라이브러리를 둘러보아야한다는 것은 매우 이상합니다. 버그 리포트가 필요하십니까?
qwerty_so 2014

여러분, 아래 답변을 제공했습니다. 보고 예상되는 것이 있으면 알려주십시오.
DILIP KOSURI

답변:


377

2016 년 9 월 업데이트

스위프트 3.0 : 사용 type(of:), 예를 들어 type(of: someThing)합니다 (이후 dynamicType키워드가 제거되었습니다)

2015 년 10 월 업데이트 :

아래 예제를 새로운 Swift 2.0 구문으로 업데이트했습니다 (예 : println로 바뀌 었습니다 print. toString()는 이제 String()).

Xcode 6.3 릴리스 정보 :

@nschum은 Xcode 6.3 릴리스 노트 가 다른 방법을 보여줍니다.

println 또는 문자열 보간과 함께 사용하면 유형 값이 완전한 얽힌 유형 이름으로 인쇄됩니다.

import Foundation

class PureSwiftClass { }

var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"

print( "String(myvar0.dynamicType) -> \(myvar0.dynamicType)")
print( "String(myvar1.dynamicType) -> \(myvar1.dynamicType)")
print( "String(myvar2.dynamicType) -> \(myvar2.dynamicType)")
print( "String(myvar3.dynamicType) -> \(myvar3.dynamicType)")

print( "String(Int.self)           -> \(Int.self)")
print( "String((Int?).self         -> \((Int?).self)")
print( "String(NSString.self)      -> \(NSString.self)")
print( "String(Array<String>.self) -> \(Array<String>.self)")

어떤 출력 :

String(myvar0.dynamicType) -> __NSCFConstantString
String(myvar1.dynamicType) -> PureSwiftClass
String(myvar2.dynamicType) -> Int
String(myvar3.dynamicType) -> String
String(Int.self)           -> Int
String((Int?).self         -> Optional<Int>
String(NSString.self)      -> NSString
String(Array<String>.self) -> Array<String>

Xcode 6.3 업데이트 :

당신은 사용할 수 있습니다 _stdlib_getDemangledTypeName():

print( "TypeName0 = \(_stdlib_getDemangledTypeName(myvar0))")
print( "TypeName1 = \(_stdlib_getDemangledTypeName(myvar1))")
print( "TypeName2 = \(_stdlib_getDemangledTypeName(myvar2))")
print( "TypeName3 = \(_stdlib_getDemangledTypeName(myvar3))")

이것을 출력으로 얻습니다.

TypeName0 = NSString
TypeName1 = __lldb_expr_26.PureSwiftClass
TypeName2 = Swift.Int
TypeName3 = Swift.String

원래 답변 :

Xcode 6.3 이전에는 _stdlib_getTypeName변수의 맹 글링 된 유형 이름이있었습니다. Ewan Swick의 블로그 항목 은 다음 문자열을 해독하는 데 도움이됩니다.

예를 들어 _TtSiSwift의 내부 Int유형을 나타냅니다 .

Mike Ash는 같은 주제를 다루는 훌륭한 블로그 항목을 가지고 있습니다.


2
어떻게 찾았 _stdlib_getTypeName()어요? 통합 REPL은 더 이상 존재 swift-ide-test하지 않으며 존재하지 않으며 Swift 모듈의 Xcode 인쇄에는 _접두사 값이 없습니다.
릴리 발라드

10
lldbrepl에서 충분히 쉽게 기호를 검색 할 수있는 것처럼 보입니다 . 이이기도 _stdlib_getDemangledTypeName()하고 _stdlib_demangleName().
릴리 발라드

1
오, 깔끔하다, 나는 image지름길을 몰랐다 target modules. 나는 다음을 사용하여 target modules lookup -r -n _stdlib_더 잘 표현되었습니다.image lookup -r -n _stdlib_ libswiftCore.dylib
Lily Ballard

1
참고-toString (...)이 String (...)으로 대체 된 것 같습니다.
Nick

6
스위프트 3.0 : dynamicType키워드가 스위프트에서 제거되었습니다. 그 자리에서 새로운 기본 기능 type(of:): 언어에 추가되었습니다 github.com/apple/swift/blob/master/CHANGELOG.md
주유

46

편집 : Swift 1.2 (Xcode 6.3)에 새로운 toString기능 이 도입되었습니다 .

이제 다음을 사용하여 모든 유형의 얽힌 유형을 인쇄하고 .self인스턴스를 사용할 수 있습니다 .dynamicType.

struct Box<T> {}

toString("foo".dynamicType)            // Swift.String
toString([1, 23, 456].dynamicType)     // Swift.Array<Swift.Int>
toString((7 as NSNumber).dynamicType)  // __NSCFNumber

toString((Bool?).self)                 // Swift.Optional<Swift.Bool>
toString(Box<SinkOf<Character>>.self)  // __lldb_expr_1.Box<Swift.SinkOf<Swift.Character>>
toString(NSStream.self)                // NSStream

YourClass.self와으로 전화하십시오 yourObject.dynamicType.

참조 : https://devforums.apple.com/thread/227425 .


2
그 스레드에 응답했지만 여기에 내 의견을 추가하겠습니다. 이러한 값은 "Metatype"유형이지만 Metatype 객체가 나타내는 유형을 찾는 쉬운 방법이없는 것 같습니다.
Matt Bridges

그것들은 Metatype 타입이며 클래스입니다. 그들은 수업을 나타냅니다. 당신의 문제가 정확히 무엇인지 확실하지 않습니다. someInstance.dynamicType.printClassName()수업 이름을 인쇄합니다.
Analog File

18
printClassName () 메소드는 문서의 샘플 중 하나에서 작성된 예제 메소드 일 뿐이며 액세스 할 수있는 API 호출이 아닙니다.
Dave Wood

4
참고-toString (...)이 String (...)으로 대체 된 것 같습니다.
Nick

33

스위프트 3.0

let string = "Hello"
let stringArray = ["one", "two"]
let dictionary = ["key": 2]

print(type(of: string)) // "String"

// Get type name as a string
String(describing: type(of: string)) // "String"
String(describing: type(of: stringArray)) // "Array<String>"
String(describing: type(of: dictionary)) // "Dictionary<String, Int>"

// Get full type as a string
String(reflecting: type(of: string)) // "Swift.String"
String(reflecting: type(of: stringArray)) // "Swift.Array<Swift.String>"
String(reflecting: type(of: dictionary)) // "Swift.Dictionary<Swift.String, Swift.Int>"

1
Swift 2 구현은 특히 enum 사례에 적합합니다. 이 행동이 Apple에 의해 문서화 / 보증되는지 여부를 아는 사람이 있습니까? 표준 라이브러리는 디버깅에 적합하다는 의견 만 포함합니다.
milos

30

찾고 계십니까?

println("\(object_getClassName(now))");

"__NSDate"를 인쇄합니다

업데이트 : Beta05부터는 더 이상 작동하지 않습니다.


2
빠른 수업에는 효과가 없습니다. 반환 "UnsafePointer (0x7FBB18D06DE0)"
aryaxt

4
NSManagedObject I에 대한, (Beta5에서 적어도) 그냥 "Builtin.RawPointer = 주소"ObjC 클래스하지 작업 중 하나를 얻을 수 있나요
켄달 Helmstetter Gelner

23

현재 Xcode는 버전 6.0 (6A280e)입니다.

import Foundation

class Person { var name: String; init(name: String) { self.name = name }}
class Patient: Person {}
class Doctor: Person {}

var variables:[Any] = [
    5,
    7.5,
    true,
    "maple",
    Person(name:"Sarah"),
    Patient(name:"Pat"),
    Doctor(name:"Sandy")
]

for variable in variables {
    let typeLongName = _stdlib_getDemangledTypeName(variable)
    let tokens = split(typeLongName, { $0 == "." })
    if let typeName = tokens.last {
        println("Variable \(variable) is of Type \(typeName).")
    }
}

산출:

Variable 5 is of Type Int.
Variable 7.5 is of Type Double.
Variable true is of Type Bool.
Variable maple is of Type String.
Variable Swift001.Person is of Type Person.
Variable Swift001.Patient is of Type Patient.
Variable Swift001.Doctor is of Type Doctor.

1
좋았지 만 질문에는 옵션도 포함되어 있습니다. 옵션의 출력은에 설정되어 Optional(...)있으므로 코드는 Optional유형으로 만 반환 됩니다. 또한 var optionalTestVar: Person? = Person(name:"Sarah")Optional (Person)과 var with Person으로 표시되어야합니다 ! ImplicitlyUnwrappedOptional (Person)
Binarian

18

Swift 1.2가 포함 된 Xcode 6.3부터는 유형 값을 전체 demangled로 간단히 변환 할 수 있습니다 String.

toString(Int)                   // "Swift.Int"
toString(Int.Type)              // "Swift.Int.Type"
toString((10).dynamicType)      // "Swift.Int"
println(Bool.self)              // "Swift.Bool"
println([UTF8].self)            // "Swift.Array<Swift.UTF8>"
println((Int, String).self)     // "(Swift.Int, Swift.String)"
println((String?()).dynamicType)// "Swift.Optional<Swift.String>"
println(NSDate)                 // "NSDate"
println(NSDate.Type)            // "NSDate.Type"
println(WKWebView)              // "WKWebView"
toString(MyClass)               // "[Module Name].MyClass"
toString(MyClass().dynamicType) // "[Module Name].MyClass"

1.2에서 다른 방향이 가능합니까? 클래스 이름을 기반으로 인스턴스를 초기화하려면?
user965972

@ user965972 내가 아는 한 아무것도 없다고 생각합니다.
kiding

17

를 통해 클래스에 계속 액세스 할 수 있습니다 className(를 반환 String).

실제로 클래스를 얻는 방법은 여러 가지가 있습니다 ( 예 classForArchiver: classForCoder, classForKeyedArchiver(all return AnyClass!)).

프리미티브의 유형을 얻을 수 없습니다 (프리미티브는 클래스 가 아닙니다 ).

예:

var ivar = [:]
ivar.className // __NSDictionaryI

var i = 1
i.className // error: 'Int' does not have a member named 'className'

프리미티브 유형을 얻으려면을 사용해야 bridgeToObjectiveC()합니다. 예:

var i = 1
i.bridgeToObjectiveC().className // __NSCFNumber

나는 그것이 원시적이라고 확신합니다. 불행히도 프리미티브 유형을 얻을 수 없습니다.
Leandros

그 예는 운동장에서 작동하지 않는 것 같습니다. 프리미티브와 비 프리미티브 모두에 ​​대한 오류가 발생합니다.
Matt Bridges

시도하십시오 import Cocoa.
Leandros

9
className은 OSX 용으로 개발할 때 NSObject에만 사용할 수있는 것으로 보입니다. NSObjects 또는 "normal"객체에 대해 iOS SDK에서 사용할 수 없음
Matt Bridges

3
classNameCocoa의 AppleScript 지원의 일부이므로 일반 내부 검사에는 사용해서는 안됩니다. 분명히 iOS에서는 사용할 수 없습니다.
Nikolai Ruhe

16

reflect를 사용하여 객체에 대한 정보를 얻을 수 있습니다.
예를 들어 객체 클래스 이름은 다음과 같습니다.

var classname = reflect (현재). 요약

베타 6에서 이것은 약간 엉망인 형태의 앱 이름 + 클래스 이름을 얻었지만 시작입니다. +1- reflect(x).summary감사합니다!
Olie

작동하지 않았다, 스위프트 1.2 엑스 코드 6.4 및 iOS 8.4에 빈 라인 출력
후안 Boero

13

나는 운이 좋았다.

let className = NSStringFromClass(obj.dynamicType)

@ hdost 친구는 아무것도 작동하지 않았지만 classForCoder는 작동했습니다.
Satheeshwaran


10

Xcode 8에서 Swift 3.0

단계 :

1. 유형을 얻으십시오 :

옵션 1:

let type : Type = MyClass.self  //Determines Type from Class

옵션 2 :

let type : Type = type(of:self) //Determines Type from self

2. 타입을 문자열로 변환 :

let string : String = "\(type)" //String

8

스위프트 3.0에서는 사용할 수 있습니다 type(of:)로, dynamicType키워드가 제거되었습니다.


7

스위프트 5

Swift 3의 최신 릴리스에서는 String초기화 프로그램을 통해 유형 이름에 대한 설명을 얻을 수 있습니다 . 예를 들어 print(String(describing: type(of: object))). 여기서 object 인스턴스 변수 일 수 어레이, 딕셔너리, 추천 Int하는 NSDate사용자 정의 클래스의 인스턴스 등

여기 내 완전한 대답이 있습니다 : Swift에서 객체의 클래스 이름을 문자열로 가져옵니다.

이 질문은 객체의 클래스 이름을 문자열로 얻는 방법을 찾고 있지만 하위 클래스가 아닌 변수의 클래스 이름을 얻는 또 다른 방법을 제안했습니다 NSObject. 여기있어:

class Utility{
    class func classNameAsString(obj: Any) -> String {
        //prints more readable results for dictionaries, arrays, Int, etc
        return String(describing: type(of: obj))
    }
}

매개 변수로 유형의 객체를 가져 와서 Any클래스 이름을 String:) 로 반환 하는 정적 함수를 만들었습니다 .

이 함수를 다음과 같은 변수로 테스트했습니다.

    let diccionary: [String: CGFloat] = [:]
    let array: [Int] = []
    let numInt = 9
    let numFloat: CGFloat = 3.0
    let numDouble: Double = 1.0
    let classOne = ClassOne()
    let classTwo: ClassTwo? = ClassTwo()
    let now = NSDate()
    let lbl = UILabel()

출력은 다음과 같습니다.

  • 사전은 사전 유형입니다.
  • 배열은 배열 유형입니다
  • numInt는 Int 유형입니다.
  • numFloat는 CGFloat 유형입니다.
  • numDouble은 Double 유형입니다.
  • classOne 유형 : ClassOne
  • classTwo 유형 : ClassTwo
  • 현재 유형은 다음과 같습니다. 날짜
  • lbl 유형은 UILabel입니다.

5

CocoaTouch가 아닌 Cocoa를 사용할 때 classNameNSObject의 서브 클래스 인 객체 의 속성을 사용할 수 있습니다 .

println(now.className)

이 속성은 NSObject의 서브 클래스가 아닌 일반 Swift 객체에는 사용할 수 없습니다 (사실 Swift에는 루트 ID 또는 객체 유형이 없음).

class Person {
    var name: String?
}

var p = Person()
println(person.className) // <- Compiler error

CocoaTouch에서는 현재 주어진 변수의 타입에 대한 문자열 설명을 얻을 수있는 방법이 없습니다. Cocoa 또는 CocoaTouch의 기본 유형에 대해서도 유사한 기능이 없습니다.

Swift REPL은 유형을 포함한 값의 요약을 인쇄 할 수 있으므로 향후 API를 통해 이러한 방식으로 검사 할 수 있습니다.

편집 : dump(object)트릭을 수행하는 것 같습니다.


Xcode 10 및 Swift 4.2부터는 dump(object)실제로 강력합니다. 감사합니다.
Alex Zavatone

5

최고 답변에는을 사용 하여이 작업을 수행하는 새로운 방법에 대한 실제 예가 없습니다 type(of:. 나 같은 도움 신인에 그래서, 여기 여기에 애플의 문서에서 주로 촬영 동작하는 예제입니다 - https://developer.apple.com/documentation/swift/2885064-type

doubleNum = 30.1

func printInfo(_ value: Any) {
    let varType = type(of: value)
    print("'\(value)' of type '\(varType)'")
}

printInfo(doubleNum)
//'30.1' of type 'Double'

4

나는 여기에 다른 답변 중 일부를 시도했지만 마일리지는 기본 개체가 무엇인지에 매우 큰 것 같습니다.

그러나 다음을 수행하여 객체의 Object-C 클래스 이름을 얻을 수있는 방법을 찾았습니다.

now?.superclass as AnyObject! //replace now with the object you are trying to get the class name for

사용 방법은 다음과 같습니다.

let now = NSDate()
println("what is this = \(now?.superclass as AnyObject!)")

이 경우 콘솔에서 NSDate를 인쇄합니다.


4

다른 사람에게도 도움이되는이 솔루션을 찾았습니다. 값에 액세스하는 클래스 메소드를 작성했습니다. NSObject 서브 클래스에서만 작동합니다. 그러나 최소한 깨끗하고 깔끔한 솔루션입니다.

class var className: String!{
    let classString : String = NSStringFromClass(self.classForCoder())
    return classString.componentsSeparatedByString(".").last;
}

4

Swift 1.2가 설치된 최신 XCode 6.3에서는 이것이 내가 찾은 유일한 방법입니다.

if view.classForCoder.description() == "UISegment" {
    ...
}

참고 : description ()은 형식으로 클래스 이름을 반환 <swift module name>.<actual class name>하므로 문자열을 a로 나누고 .마지막 토큰을 얻으려고합니다.
Matthew Quiros

4

여기의 많은 답변은 최신 Swift (작성시 Xcode 7.1.1)에서 작동하지 않습니다.

정보를 얻는 현재의 방법은 정보를 만들고 Mirror심문하는 것입니다. 클래스 이름의 경우 다음과 같이 간단합니다.

let mirror = Mirror(reflecting: instanceToInspect)
let classname:String = mirror.description

개체에 대한 추가 정보는에서 검색 할 수도 있습니다 Mirror. 자세한 내용은 http://swiftdoc.org/v2.1/type/Mirror/ 를 참조 하십시오 .


답변 stackoverflow.com/a/25345480/1187415stackoverflow.com/a/32087449/1187415 ? 둘 다 스위프트 2에서 잘 작동하는 것 같습니다. (다른 것을 확인하지 않았습니다.)
Martin R

나는 이것을 일반적인 해결책으로 좋아하지만 "Mirror for ViewController"( "Mirror for")를 얻는다-잠깐, ".subjectType"을 사용하는 것이 속임수이다!
David H

3

베타 5부터 lldb에서 다음 명령을 사용하여 객체의 클래스를 볼 수 있습니다.

fr v -d r shipDate

다음과 같은 결과가 출력됩니다.

(DBSalesOrderShipDate_DBSalesOrderShipDate_ *) shipDate = 0x7f859940

확장 된 명령은 다음과 같은 의미입니다.

Frame Variable (프레임 변수를 인쇄하십시오) -d run_target (동적 확장 유형)

알아두면 유용한 것은 "프레임 변수"를 사용하여 변수 값을 출력하면 코드가 실행되지 않는다는 것입니다.


3

자체 개발 수업에 대한 솔루션을 찾았습니다 (또는 귀하가 액세스 할 수 있음).

객체 클래스 정의 내에 다음과 같은 계산 된 속성 을 배치하십시오.

var className: String? {
    return __FILE__.lastPathComponent.stringByDeletingPathExtension
}

이제 객체에서 클래스 이름을 간단히 호출 할 수 있습니다.

myObject.className

이것은 클래스 정의가 원하는 클래스와 정확히 같은 이름의 파일 내에서 만들어진 경우에만 작동합니다 .

이이므로 일반적으로 경우 위의 대답은 대부분의 경우 그것을해야한다 . 그러나에 어떤 특별한 경우에는 다른 해결책을 강구해야 할 수도 있습니다.


클래스 (파일) 자체 내에 클래스 이름이 필요한 경우 다음 줄을 사용하면됩니다.

let className = __FILE__.lastPathComponent.stringByDeletingPathExtension

어쩌면이 방법은 일부 사람들을 도울 수 있습니다.


3

위의 Klass와 Kevin Ballard가 제공 한 답변과 의견을 바탕으로 다음과 같이 갈 것입니다.

println(_stdlib_getDemangledTypeName(now).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon?).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon!).componentsSeparatedByString(".").last!)

println(_stdlib_getDemangledTypeName(myvar0).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar1).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar2).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar3).componentsSeparatedByString(".").last!)

인쇄됩니다 :

"NSDate"
"ImplicitlyUnwrappedOptional"
"Optional"
"NSDate"

"NSString"
"PureSwiftClass"
"Int"
"Double"

이것이 더 나은 대답이라고 생각합니다.
maschall

Swift 1.2에서 다음을 사용했습니다.. toString(self.dynamicType).componentsSeparatedByString(".").last!분명히 객체 컨텍스트에 있었고 참조 할 수있었습니다 self.
Joe

3
let i: Int = 20


  func getTypeName(v: Any) -> String {
    let fullName = _stdlib_demangleName(_stdlib_getTypeName(i))
    if let range = fullName.rangeOfString(".") {
        return fullName.substringFromIndex(range.endIndex)
    }
    return fullName
}

println("Var type is \(getTypeName(i)) = \(i)")

3

스위프트 버전 4 :

print("\(type(of: self)) ,\(#function)")
// within a function of a class

감사합니다 @Joshua Dance


3

스위프트 4 :

// "TypeName"
func stringType(of some: Any) -> String {
    let string = (some is Any.Type) ? String(describing: some) : String(describing: type(of: some))
    return string
}

// "ModuleName.TypeName"
func fullStringType(of some: Any) -> String {
    let string = (some is Any.Type) ? String(reflecting: some) : String(reflecting: type(of: some))
    return string
}

용법:

print(stringType(of: SomeClass()))     // "SomeClass"
print(stringType(of: SomeClass.self))  // "SomeClass"
print(stringType(of: String()))        // "String"
print(fullStringType(of: String()))    // "Swift.String"

2

임의의 값 유형의 유형 이름을 인쇄하는 일반적인 방법은 없습니다. 다른 사람들이 지적했듯이 클래스 인스턴스의 경우 인쇄 할 수 있습니다value.className 있지만 기본 값의 경우 런타임에 유형 정보가 사라진 것으로 보입니다.

예를 들어 다음과 같이 입력하는 방법이없는 것처럼 보입니다 :의 값을 1.something()얻으십시오 . (다른 대답에서 제안한 것처럼 힌트를 제공 하는 데 사용할 수 있지만 실제로는 유형 이 아닙니다 . Objective-C 함수 호출의 경계를 넘을 때 변환 되는 유형입니다 .)Intsomethingi.bridgeToObjectiveC().className__NSCFNumberi

나는 틀렸다는 것이 기쁘지 만 타입 검사가 모두 컴파일 타임에 수행되는 것처럼 보이고 C ++ (RTTI가 비활성화 된 상태)처럼 많은 유형 정보가 런타임에 사라졌습니다.


Xcode6의 놀이터에서 작동하는 예제에서 classnow를 사용하여 변수 "now"에 대해 "NSDate"를 인쇄하는 예제를 제공 할 수 있습니까? 내가 알 수있는 한, className은 Swift 객체, 심지어 NSObject의 서브 클래스 인 객체에서도 정의되지 않습니다.
Matt Bridges

'className'은 NSObject에서 내려 오는 객체에 사용할 수 있지만 iOS 용이 아닌 mac 용으로 개발할 때만 사용할 수 있습니다. iOS에는 전혀 해결 방법이 없습니다.
Matt Bridges

1
네, 여기서 중요한 사실은 일반적으로 타입 정보가 런타임에 빠르게 사라진다는 것 같습니다.
ipmcc

그래도 REPL이 값 유형을 어떻게 인쇄 할 수 있는지 궁금합니다.
Matt Bridges

REPL은 거의 확실하게 해석되고 컴파일되지 않으므로 쉽게 설명 할 수 있습니다
ipmcc

2

이것은 당신이 당신의 타입 캐릭터 얻는 방법이다 객체 또는 유형 입니다 일관 하고 고려하는 데 걸리는 모듈 오브젝트 정의에 속하거나 스위프트 4.x의에. 작품에 중첩

@inline(__always) func typeString(for _type: Any.Type) -> String {
    return String(reflecting: type(of: _type))
}

@inline(__always) func typeString(for object: Any) -> String {
    return String(reflecting: type(of: type(of: object)))
}

struct Lol {
    struct Kek {}
}

// if you run this in playground the results will be something like
typeString(for: Lol.self)    //    __lldb_expr_74.Lol.Type
typeString(for: Lol())       //    __lldb_expr_74.Lol.Type
typeString(for: Lol.Kek.self)//    __lldb_expr_74.Lol.Kek.Type
typeString(for: Lol.Kek())   //    __lldb_expr_74.Lol.Kek.Type

2

Swift 에서 객체 유형 또는 객체 클래스 를 얻으려면 유형 (of : yourObject) 을 사용해야합니다

유형 (of : yourObject)


1

정확히 당신이 무엇을했는지는 아니지만 Swift 유형과 비교하여 변수 유형을 확인할 수도 있습니다.

let object: AnyObject = 1

if object is Int {
}
else if object is String {
}

예를 들어.


1

Xcode 7.3.1, 스위프트 2.2 :

String(instanceToPrint.self).componentsSeparatedByString(".").last

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.