(discord/swift/2018/03/05/0) extension時のclass->protocol、protocol->classのケースに置けるwhereの挙動

概要

  • discord ios dev
    • #swift
    • 2018/03/05
  • classのextension時 ( Clazz=クラス, Proto=プロトコル )
    • extension Proto where Self : Clazz {}はイケる
    • extension Clazz where Self : Proto {}はダメという話

log

omochimetaru - 3/5 12:33

protocol AppViewController { 
  var disposeBag : DisposeBag { get }
}

extension AppViewController where Self : UIViewController { } // OK
extension UIViewController where Self : AppViewController {} // NG

こういうもんだっけ。難しい。


hiragram - 3/5 13:26

あるある


tarunon - 3/5 18:40

ヒラリ術を使うと

protocol AppViewController where Self: UIViewController {
  var disposeBag: DisposeBag { get }
}

って宣言できる

いつから出来るようになったか知らない


omochimetaru - 3/5 18:41

あ、そうやるのか、thx


hiragram - 3/5 18:41

↑それでもextension内で例えばself.viewをいじろうとしたらselfはletだから書き換えられないよ〜〜〜みたいなことを

言われたのでprotocol ~~~ class where: UIViewController にしたよ

class無くてもself.view書き換えられてほしいけど


tarunon - 3/5 18:42

VCの.view書き換えはちょっと野蛮じゃないか?


hiragram - 3/5 18:42

あいや

addSubviewも怒られた気がする


tarunon - 3/5 18:42

それはいけた気がする


hiragram - 3/5 18:42

mutating扱いなのかな?とか思ったけどviewじゃなかったかも。titleとかだったかも。


tarunon - 3/5 18:42

それはありそう


hiragram - 3/5 18:42

とにかくselfはletのconstantだから書き換えられませんって言われてclassを足したのは確かだと思う


omochimetaru - 3/5 18:43

AppViewControllerのextension funcでself.view = nil かいてもコンパイルできた


tarunon - 3/5 18:46

野蛮だ


hiragram - 3/5 18:46

class ナシでも?

あれー


omochimetaru - 3/5 18:46

うん


tarunon - 3/5 18:46

かしこい


omochimetaru - 3/5 18:46

where付ける前の事なんじゃない?


hiragram - 3/5 18:46

じゃーなんか勘違いしてたかなあ

うーん。そうかも。