Swiftyなextensionを書こうとしたら型がどっかいった話

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とか読んでみたいと思う。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.