在Swift中打印结构体名称

22
在Swift中,是否可以知道结构体的名称?我知道这对于类是可能的:

class

示例

class Example {
   var variable1 = "one"
   var variable2 = "2"
}

如果我想打印出这个类的名字,我只需要这样做:

NSStringFromClass(Example).componentsSeparatedByString(".").last!

但我能否对结构体struct做类似的操作呢?

示例

如果我有一个struct

struct structExample {
   var variable1 = "one"
   var variable2 = "2"
}

我如何获取这个struct的名字"structExample"

谢谢。

4个回答

12

如果你需要非实例化结构体的名称,你可以请求其 self

struct StructExample {
    var variable1 = "one"
    var variable2 = "2"
}

print(StructExample.self) // prints "StructExample"

例如,我会使用CustomStringConvertible和dynamicType:

struct StructExample: CustomStringConvertible {
    var variable1 = "one"
    var variable2 = "2"
    var description: String {
        return "\(self.dynamicType)"
    }
}

print(StructExample()) // prints "StructExample"

关于 Swift 3,这里的示例中,self.dynamicType 已更名为 type(of: self)


9

这个纯Swift版本与类一样适用于结构体:https://dev59.com/c2Af5IYBdhLWcg3w9Wmu#31050781

如果您想要操作类型对象本身:

let structName = "\(structExample.self)"

如果您有一个结构体实例:
var myInstance = structExample()
let structName = "\(myInstance.dynamicType)"

有趣的是,返回的Type对象似乎不符合CustomStringConvertible协议。因此它没有'description'属性,尽管""模式仍然能正常工作。

4
print("\(String(describing: Self.self))")

1

带扩展的便捷协议:

public protocol Describable {
    var typeName: String { get }
}

extension Describable {
    public var typeName: String {
        return String(describing: Self.self)
    }
}

使用示例:

struct AccountLoginRequest: Equatable, Codable, Describable
{
    let email: String?
    let password: String?

    var description: String {
        return "[\(typeName) email=\(email), password=\(password)]"
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接