Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I print the type or class of a variable in Swift?

Tags:

types

swift

Is there a way to print the runtime type of a variable in swift? For example:

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 

In the example above, I'm looking for a way to show that the variable "soon" is of type ImplicitlyUnwrappedOptional<NSDate>, or at least NSDate!.

like image 397
Matt Bridges Avatar asked Jun 03 '14 02:06

Matt Bridges


People also ask

How do you print a variable in Swift?

In Swift, you can print a variable or a constant to the screen using the print() function.

What is the type of a type in Swift?

In Swift, there are two kinds of types: named types and compound types. A named type is a type that can be given a particular name when it's defined. Named types include classes, structures, enumerations, and protocols. For example, instances of a user-defined class named MyClass have the type MyClass .

How can I check if an object is of a given type in Swift?

“Use the type check operator (is) to check whether an instance is of a certain subclass type. The type check operator returns true if the instance is of that subclass type and false if it is not.” Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.


1 Answers

Update September 2016

Swift 3.0: Use type(of:), e.g. type(of: someThing) (since the dynamicType keyword has been removed)

Update October 2015:

I updated the examples below to the new Swift 2.0 syntax (e.g. println was replaced with print, toString() is now String()).

From the Xcode 6.3 release notes:

@nschum points out in the comments that the Xcode 6.3 release notes show another way:

Type values now print as the full demangled type name when used with println or string interpolation.

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)") 

Which outputs:

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> 

Update for Xcode 6.3:

You can use the _stdlib_getDemangledTypeName():

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

and get this as output:

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

Original answer:

Prior to Xcode 6.3 _stdlib_getTypeName got the mangled type name of a variable. Ewan Swick's blog entry helps to decipher these strings:

e.g. _TtSi stands for Swift's internal Int type.

Mike Ash has a great blog entry covering the same topic.

like image 191
Klaas Avatar answered Oct 17 '22 08:10

Klaas