LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-29

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0