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

2019-01-01 09:47发布

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!.

标签: swift types
30条回答
长期被迫恋爱
2楼-- · 2019-01-01 10:23

SWIFT 3

With the latest release of Swift 3 we can get pretty descriptions of type names through the String initializer. Like, for example print(String(describing: type(of: object))). Where object can be an instance variable like array, a dictionary, an Int, a NSDate, an instance of a custom class, etc.

Here is my complete answer: Get class name of object as string in Swift

That question is looking for a way to getting the class name of an object as string but, also i proposed another way to getting the class name of a variable that isn't subclass of NSObject. Here it is:

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

I made a static function which takes as parameter an object of type Any and returns its class name as String :) .

I tested this function with some variables like:

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

and the output was:

  • diccionary is of type Dictionary
  • array is of type Array
  • numInt is of type Int
  • numFloat is of type CGFloat
  • numDouble is of type Double
  • classOne is of type: ClassOne
  • classTwo is of type: ClassTwo
  • now is of type: Date
  • lbl is of type: UILabel
查看更多
栀子花@的思念
3楼-- · 2019-01-01 10:25

I've found a solution for self-developed classes (or such you have access to).

Place the following computed property within your objects class definition:

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

Now you can simply call the class name on your object like so:

myObject.className

Please note that this will only work if your class definition is made within a file that is named exactly like the class you want the name of.

As this is commonly the case the above answer should do it for most cases. But in some special cases you might need to figure out a different solution.


If you need the class name within the class (file) itself you can simply use this line:

let className = __FILE__.lastPathComponent.stringByDeletingPathExtension

Maybe this method helps some people out there.

查看更多
回忆,回不去的记忆
4楼-- · 2019-01-01 10:26

In Swift 3.0, you can use type(of:), as dynamicType keyword has been removed.

查看更多
妖精总统
5楼-- · 2019-01-01 10:28

This is how you get a type string of your object or Type which is consistent and takes into account to which module the object definition belongs to or nested in. Works in Swift 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
查看更多
孤独寂梦人
6楼-- · 2019-01-01 10:29

Not exactly what you are after, but you can also check the type of the variable against Swift types like so:

let object: AnyObject = 1

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

For example.

查看更多
不流泪的眼
7楼-- · 2019-01-01 10:30

The top answer doesn't have a working example of the new way of doing this using type(of:. So to help rookies like me, here is a working example, taken mostly from Apple's docs here - 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'
查看更多
登录 后发表回答