在swift中获取用户可读的类名(在objc NSStringFromClass中很好)

jfl*_*fla 29 cocoa-touch swift

在Swift中是否有一个等效的NSStringFromClass,它提供了类名的用户可读版本?我试图将它与我创建的本机Swift类一起使用,但正如您所看到的,结果似乎是编译器类名的内部表示:

println(NSStringFromClass(MyClass.self))
Run Code Online (Sandbox Code Playgroud)

结果:

_TtC5test7MyClass
Run Code Online (Sandbox Code Playgroud)

我已经尝试将@objc属性添加到类中,并使其成为NSObject的子类,但它没有任何区别.我发现如果我用同名的Objective-C类替换MyClass,并在桥接头中导入它,它会给我'MyClass',但这不是必需的.

另一种选择是为此制定一个协议,我想以这种方式使用的每个类必须符合:

protocol Nameable {
    class var className: String { get }
}
Run Code Online (Sandbox Code Playgroud)

但是,在语言中使用内置方法更容易.

Nat*_*bot 62

你现在可以这样做:

String(MyClass)
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 3中,这不再起作用了.Swift 3转换器将其更改为String(描述:MyClass),但这也不起作用. (7认同)

Imp*_*ero 25

基于xcode 6 beta 5的新格式.

(PROJECT_NAME).(CLASS_NAME)

func getName(classType:AnyClass) -> String {

    let classString = NSStringFromClass(classType.self)
    let range = classString.rangeOfString(".", options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start:classString.startIndex, end: classString.endIndex), locale: nil)
    return classString.substringFromIndex(range!.endIndex)
}
Run Code Online (Sandbox Code Playgroud)

最新6.3 Xcode Swift 1.2

如果您需要扩展名,或者您可以将其放在任何常见对象上:

public extension NSObject{
    public class var nameOfClass: String{
        return NSStringFromClass(self).componentsSeparatedByString(".").last!
    }

    public var nameOfClass: String{
        return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 14

斯威夫特3

type(of: self) 打印ModuleName.ClassName

String(describing: type(of: self)) 打印ClassName


Ada*_*ght 5

目前,没有可靠的方法来做到这一点.请参阅Apple开发人员对https://devforums.apple.com/thread/227425的评论

斯威夫特目前没有太多的内省.

有一些用于游乐场的内省机器.我不知道这是不是API.

可以使用Objective-C运行时的内省来检查一些Swift方法和变量.这可能是今天最好的解决方案.

Swift确实具有元类型的概念,有点类似于Objective C中的Class类型.您可以使用它来找到它TypeName.self,例如:

class Foo {
    @required  init() {
    }
}

var normalFoo : Foo = Foo()
var fooType : Foo.Type = Foo.self;
var fooFromMetatype : Foo = fooType();
Run Code Online (Sandbox Code Playgroud)

也许,在发布时间,元类型将包括更多的内省能力.我建议为此提交雷达功能请求.


hnh*_*hnh 5

在Swift 2 beta 4中,您可以通过类型对象获取信息:

let className = "\(String.self)"   // gives: "Swift.String"
Run Code Online (Sandbox Code Playgroud)

或者如果你有一个实例:

let s = "Hello World"
let className = "\(s.dynamicType)" // gives: "Swift.String"
Run Code Online (Sandbox Code Playgroud)

您将获得Module.Class结果,如:

Swift.String
ABC.MyGenericClass<Swift.Int>
Run Code Online (Sandbox Code Playgroud)

有趣的是,返回的Type对象似乎不符合CustomStringConvertible协议.因此它没有"描述"属性,尽管""模式仍然是正确的.

PS:在b4之前,可以通过reflect(obj.dynamicType).summary完成相同的操作.