Class.ex_className
みたいなのをSwiftyにしたくてClass.ex.className
みたいにしたかったんだけど、どうも動きが怪しい。
protocol ExCompatible {
associatedtype CompatibleType
static var ex: CompatibleType.Type { get }
}
final class Extension<Base> {
let base: Base
public init(_ base: Base) {
self.base = base
}
}
final class StaticExtension<Base> {}
extension ExCompatible {
static var ex: StaticExtension<Self>.Type { return StaticExtension<Self>.self }
}
class Sample: NSObject {}
extension NSObject: ExCompatible {}
extension StaticExtension where Base: NSObject {
static var className: String {
return NSStringFromClass(Base.self).components(separatedBy: ".").last!
}
}
func call1(klass: NSObject.Type) -> String {
return klass.ex.className
}
func call2<T: NSObject>(klass: T.Type) -> String {
return klass.ex.className
}
extension Sample {
static func call5() {
ex.className
}
}
extension NSObject {
static func call6() {
ex.className
}
}
call1(klass: Sample.self) //NSObject
call2(klass: Sample.self) //Sample
call1とcall2で結果が違う
extension NSObject {
static var className: String {
return NSStringFromClass(self).components(separatedBy: ".").last!
}
}
func call3(klass: NSObject.Type) -> String {
return klass.className
}
func call4<T: NSObject>(klass: T.Type) -> String {
return klass.className
}
call3(klass: Sample.self) //Sample
call4(klass: Sample.self) //Sample
そのまま生やした時は問題無い。
call1はexを経由したタイミングでNSObject.Typeとして解決されちゃっている気がする。
staticなメソッドでクラス名ちゃんと取るのどうすればいいんだろ、気が向いたらsilとか読んでみたいと思う。