在Swift中进行基本反射时,我遇到了一些障碍。第一个与协议中的静态var有关。与要求实现定义一个类var是否一样?第二个原因是当类以AnyClass类型传递时返回类的名称吗?这是正确的做法吗?

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"

关于ios - 协议(protocol)和反射中的静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30686975/

10-13 03:25