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)
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)
目前,没有可靠的方法来做到这一点.请参阅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)
也许,在发布时间,元类型将包括更多的内省能力.我建议为此提交雷达功能请求.
在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完成相同的操作.
| 归档时间: |
|
| 查看次数: |
16009 次 |
| 最近记录: |