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

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

ただいまの
回答率

90.47%

  • Swift

    7492questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 501

K.marie-N

score 3

 前提・実現したいこと

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

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

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

Multiple inheritance from classes 'UIViewController' and 'NetAlert'

 該当のソースコード

import UIKit

class NetAlert {
    func alert(){
        DispatchQueue.main.async {

            let changePrivatySetting = "インターネットに接続できません。設定画面に移りますか?"
            let message = NSLocalizedString(changePrivatySetting, comment: "インターネットに接続できません。設定画面に移りますか?")
            let    alertController = UIAlertController(title: "インターネットに接続できません", message: message, preferredStyle: .alert)
            alertController.addAction(UIAlertAction(title: NSLocalizedString("キャンセル", comment: "Alert Cancel button"), style: .cancel, handler: nil))
            alertController.addAction(UIAlertAction(title: NSLocalizedString("設定",
                                                                             comment: "Alert button to open Settings"),
                                                    style: .default, handler: { _ in
                                                        UIApplication.shared.open(URL(string: "App-Prefs:root")!, options: [:], completionHandler: nil)
            }))
        }
    }
}
import UIKit
import Reachability

//以下に「Multiple inheritance from classes 'UIViewController' and 'NetAlert'」と出る
class ViewController: UIViewController, NetAlert {

    let reachability = Reachability()!


    @IBAction func btn(_ sender: Any) {
        let reachability = Reachability()!


        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")
        }
    }

}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

class ViewController: UIViewController, NetAlert {

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

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

class ViewController: UIViewController {

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/15 15: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")
    }
    }
    }
    ーーーーーーーーーーーーーーーーーーーーーーーーーーー

    キャンセル

  • 2018/06/15 15:59

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

    キャンセル

  • 2018/06/15 16:14

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

    キャンセル

0

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

class ViewController: UIViewController {
    func hoge() {
        self.alert() //呼び出し
    }
}

extension ViewController { //UIViewControllerでも可
    func alert() {
        /* 省略 */
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/15 16:18

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

    また質問等ありました際は、ご教授頂ければと思います。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    UIAlertController のサンプルコードを探しています

    ios9, iPod touch, xcode7 初心者です。  alert view を表示させようと参考書のプログラムを ダウンロードしたところ、 UIAlertView 

  • 解決済

    Swift:UIAlertActionを別クラスから呼び出したい:iOS

    UIAlertActionを別クラスから呼び出したいのですがself.presentViewController(alert, animated: true, completion

  • 受付中

    _BSMachError が出る

    前提・実現したいこと swiftで実機で開発を行っているのですが、以下のエラーが出る原因がわかりません。 発生している問題・エラーメッセージ 2016-07-25 15:

  • 解決済

    UIAlertController上のUITextFieldの未入力を防ぐ方法

    前提・実現したいこと 質問をご覧いただきまして、ありがとうございます。 現在、UIAlertController上のUITextFieldでinputしてもらうという機能を

  • 解決済

    tableview セクションについて

    こちらのようなAdd Sectinのボタンをタップしたらセクションが追加され、Abb Rowのボタンをタップしたらrowが追加されるプログラムを組みたいです また出来たらab

  • 解決済

    アラートの表示でのエラー

    アラートの表示でのエラーが出ています。 Static member 'Alert' cannot be used on instance of type 'UIAlertCont

  • 解決済

    tableview section でエラー

    コードimport UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewD

  • 受付中

    UIAlertActionについて

    UIAlertActionについて、 (action: UIAlertAction) in の部分がどう動いているのかが分かりません。 クロージャへの理解が浅いのも有ると思い

同じタグがついた質問を見る

  • Swift

    7492questions

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