协议和反射中的静态变量
Static var in protocol and reflection
在 Swift 中进行基本反思时,我遇到了几个障碍。第一个与协议中的静态变量有关。这不就和要求实现定义一个class var一样吗?第二个与作为 AnyClass 类型传递时返回 class 的名称有关?这是正确的做法吗?
protocol Nameable {
static var name: String { get }
}
func nameForClass(cls: AnyClass) -> String {
var name = ""
if let cls = cls as? Nameable {
name = cls.name
}
if (name.isEmpty) {
name = NSStringFromClass(cls.self)
}
return name
}
class A : Nameable {
static var name: String {
return "ClassA"
}
}
class B : Nameable {
static var name: String {
return ""
}
}
println(nameForClass(A.self)) // Should print "ClassA"
println(nameForClass(B.self)) // Should print "B"
就我个人而言,在这种情况下我会使用重载:
func nameForClass<T>(Type: T.Type) -> String {
return "\(Type)"
}
func nameForClass<T: Nameable>(Type: T.Type) -> String {
return Type.name.isEmpty ? "\(Type)" : Type.name
}
用法:
println(nameForClass(A.self)) // Prints "ClassA"
println(nameForClass(B.self)) // Prints "__lldb_expr_47.B"
不使用 AnyClass
的一个优点是您还可以传递结构或枚举,它们的工作方式相同:
struct C {}
enum D : Nameable {
static var name: String {
return "EnumD"
}
}
println(nameForClass(C.self)) // Prints: "__lldb_expr_49.C"
println(nameForClass(D.self)) // Prints: "EnumD"
在 Swift 中进行基本反思时,我遇到了几个障碍。第一个与协议中的静态变量有关。这不就和要求实现定义一个class var一样吗?第二个与作为 AnyClass 类型传递时返回 class 的名称有关?这是正确的做法吗?
protocol Nameable {
static var name: String { get }
}
func nameForClass(cls: AnyClass) -> String {
var name = ""
if let cls = cls as? Nameable {
name = cls.name
}
if (name.isEmpty) {
name = NSStringFromClass(cls.self)
}
return name
}
class A : Nameable {
static var name: String {
return "ClassA"
}
}
class B : Nameable {
static var name: String {
return ""
}
}
println(nameForClass(A.self)) // Should print "ClassA"
println(nameForClass(B.self)) // Should print "B"
就我个人而言,在这种情况下我会使用重载:
func nameForClass<T>(Type: T.Type) -> String {
return "\(Type)"
}
func nameForClass<T: Nameable>(Type: T.Type) -> String {
return Type.name.isEmpty ? "\(Type)" : Type.name
}
用法:
println(nameForClass(A.self)) // Prints "ClassA"
println(nameForClass(B.self)) // Prints "__lldb_expr_47.B"
不使用 AnyClass
的一个优点是您还可以传递结构或枚举,它们的工作方式相同:
struct C {}
enum D : Nameable {
static var name: String {
return "EnumD"
}
}
println(nameForClass(C.self)) // Prints: "__lldb_expr_49.C"
println(nameForClass(D.self)) // Prints: "EnumD"