質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1270閲覧

swift サブクラスでスーパークラスのメソッドを実行したくない時

ttah

総合スコア35

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/08 06:45

編集2020/05/08 08:23

スーパークラスのメソッドをサブクラスで実行したくないのですが、
継承に不慣れでやり方が分からず困っています。

現在

swift

1class SupperClass: UIViewController { 2 3 @IBOutlet weak var buttonA: UIButton! 4 5 let image = UIImage(named: "image") 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 setButton(button: buttonA) 11 } 12 13 func setButton(button: UIButton) { 14 button.setImage(image, for: .normal) 15 } 16 } 17

swift

1class SubClass: SupperClass { 2 3 @IBOutlet weak var buttonB: UIButton! 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 setButton(button: buttonB) 9 10 } 11

上記だとSubClassにアクセスした時に スーパークラスのsetButton(button: buttonA) でnilのエラーになります

エラーが出ないようにする為にはどのようにすれば良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/08 07:21

何のためにそのようなことをしたいのでしょうか。
MasakiHori

2020/05/08 07:33

この問題に直面した時に一番初めに考えるべき事柄はこの2つのクラスは本当に継承関係にあるのかということです。 実際に問題が発生しているコードが提示されれば何らかの返答が出来るかもしれませんが、提示のコードではその判別はできませんので、詳しくはis-a関係とかでググってください。
ttah

2020/05/08 08:32 編集

> maisumakun様 分かりやすさ重視で単純化しましたが返って具体的な利用シーンが想定しづらくなってしまった様ですみません。質問を修正させて頂きました。 >MasakiHori 閲覧有難うございます 継承関係はサブクラスに class SubClass: SupperClass  と記述したのみです。 サブクラスでスーパークラスのメソッド等は使えているので継承関係はなりったていると思い込んでいましたが不足やなりたっていなかったりしますでしょうか? 質問の修正させて頂きました。
guest

回答1

0

ベストアンサー

ご提示の2つのクラスは継承関係にあるとは思えません。

私なら例えば

swift

1extension UIImage { 2 static var buttonImage: UIImage { UIImage(named: "image") } 3} 4 5 6class SupperClass: UIViewController { 7 .... 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 buttonA.setImage(.buttonImage, for: .normal) 12 } 13} 14 15class SubClass: UIViewController { 16 .... 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 buttonB.setImage(.buttonImage, for: .normal) 21 } 22}

とします。

UIButtonへのUIImageのセットを簡略化したいのであれば

swift

1extension UIButton { 2 var normalImage: UIImage? { 3 get { image(for: .normal) } 4 set { setImage(newValue, for: .normal) } 5 } 6}

などとすればよいのではないでしょうか?
こうしておけば上の例では

swift

1class SupperClass: UIViewController { 2 .... 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 buttonA.normalImage = .buttonImage 7 } 8}

となります。

一部の機能を共通化したいだけであれば、継承を選ばず機能をstruct/class/protocol(+extesion)にするとよいでしょう。
例えばUIGestureRecognizerは機能をクラスにしたものと言えます。
UIViewがその機能を持っていてもおかしくないものですがクラスとして切り離されている。
これによって柔軟なプログラミングが可能になっています。

投稿2020/05/08 09:50

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttah

2020/05/08 11:36

解決策の具体的なコードの提示と丁寧な解説有難うございます。 共有化の勉強になりました。 (これは完全の私の質問が悪いのですが、修正したせいで話が共有化の話になってしまっったのですが、質問の本質は、タイトルのとおり親クラスのメソッドを子クラスで実行しない方法だったのでまた別で質問をさせていただくので、目にする機会がありましたらよろしくい願いします。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問