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

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

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

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

Q&A

解決済

2回答

8177閲覧

「Multiple inheritance from〜」とエラーが出てしまう(多重継承・・・?)

mary0303

総合スコア13

Swift

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

0グッド

0クリップ

投稿2018/06/15 05:53

前提・実現したいこと

お世話になっております。
現在、Wi-Fiに接続しているかどうかの判定できるアプリケーションを作成しています。
ボタンをタップしたときに判定し、Wi-Fiに接続されていない場合設定画面に遷移するよう促すアラートを表示するようにしたいと考えています。
継承の勉強も兼ねて、敢えて2つのファイルを作成していますが、「Multiple inheritance from classes 'UIViewController' and 'NetAlert'」とエラーが出てしまいます。

どの様に解決すればいいのか分からないため、ご教授よろしくお願いします。

発生している問題・エラーメッセージ

Multiple inheritance from classes 'UIViewController' and 'NetAlert'

該当のソースコード

Swift

1import UIKit 2 3class NetAlert { 4 func alert(){ 5 DispatchQueue.main.async { 6 7 let changePrivatySetting = "インターネットに接続できません。設定画面に移りますか?" 8 let message = NSLocalizedString(changePrivatySetting, comment: "インターネットに接続できません。設定画面に移りますか?") 9 let alertController = UIAlertController(title: "インターネットに接続できません", message: message, preferredStyle: .alert) 10 alertController.addAction(UIAlertAction(title: NSLocalizedString("キャンセル", comment: "Alert Cancel button"), style: .cancel, handler: nil)) 11 alertController.addAction(UIAlertAction(title: NSLocalizedString("設定", 12 comment: "Alert button to open Settings"), 13 style: .default, handler: { _ in 14 UIApplication.shared.open(URL(string: "App-Prefs:root")!, options: [:], completionHandler: nil) 15 })) 16 } 17 } 18} 19

Swift

1import UIKit 2import Reachability 3 4//以下に「Multiple inheritance from classes 'UIViewController' and 'NetAlert'」と出る 5class ViewController: UIViewController, NetAlert { 6 7 let reachability = Reachability()! 8 9 10 @IBAction func btn(_ sender: Any) { 11 let reachability = Reachability()! 12 13 14 reachability.whenReachable = { reachability in 15 if reachability.connection == .wifi { 16 print("Wi-Fiに繋がってるよ") 17 } 18 } 19 reachability.whenUnreachable = { _ in 20 if reachability.connection == .none { 21 print("電波無いよ") 22 NetAlert().alert() 23 } 24 25 } 26 do { 27 try reachability.startNotifier() 28 } catch { 29 print("Unable to start notifier") 30 } 31 } 32 33}

補足情報(FW/ツールのバージョンなど)

使用ツール:Xcode9.4 使用言語:Swift4

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

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

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

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

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

guest

回答2

0

ベストアンサー

class ViewController: UIViewController, NetAlert {

ViewControllerの親クラスとしてUIViewControllerクラスとNetAlertクラスの2つのクラスが指定されていますが、
Swiftではこのように複数の親クラスから派生クラスを作ること(=多重継承)を許可していません。

設計の方針はわかりませんが、

class ViewController: UIViewController {

のように親を一つとし、NetAlertのalert関数をViewControllerのメンバに持たせれば問題なく動作すると思います。

投稿2018/06/15 06:06

編集2018/06/15 06:07
takabosoft

総合スコア8356

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

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

mary0303

2018/06/15 06:34

ご回答ありがとうございます。 記述としてはこの様な書き方で正しいでしょうか? エラーは出てこなくなりましたが、出てくるはずのアラートが表示されません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー //ViewController.swift import UIKit import Reachability class ViewController: UIViewController { @IBAction func btn(_ sender: Any) { let reachability = Reachability()!    //追加しました let netAlert = NetAlert() reachability.whenReachable = { reachability in if reachability.connection == .wifi { print("Wi-Fiに繋がってるよ") } } reachability.whenUnreachable = { _ in if reachability.connection == .none { print("電波無いよ") //修正しました netAlert.alert() } } do { try reachability.startNotifier() } catch { print("Unable to start notifier") } } } ーーーーーーーーーーーーーーーーーーーーーーーーーーー
takabosoft

2018/06/15 06:59

① func alert() 本体をViewControllerのメンバ関数として移動させてください。②alertControllerを宣言しただけで最後に「アラートを表示する」命令が抜けているので、presentして表示させてください。
mary0303

2018/06/15 07:14

アラートを表示させる「present」が抜けていたため、追加した所、希望通りに動作しました! 親切に教えて頂き、本当にありがとうございました!
guest

0

Swiftは多重継承出来ません。
実装を分けたいということであれば、extensionを使って分けることが出来ます。

swift

1class ViewController: UIViewController { 2 func hoge() { 3 self.alert() //呼び出し 4 } 5} 6 7extension ViewController { //UIViewControllerでも可 8 func alert() { 9 /* 省略 */ 10 } 11}

投稿2018/06/15 06:20

fuzzball

総合スコア16731

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

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

mary0303

2018/06/15 07:18

ご回答ありがとうございます。 私自身、extensionを使うという発想が出てきませんでした。 学習不足を実感したので、これからextensionについて学習したいと思います。 また質問等ありました際は、ご教授頂ければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問