🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2117閲覧

SwiftUIのViewプロトコルのクラス継承ができません

kon_do

総合スコア14

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/12/25 17:05

編集2019/12/26 12:13

前提

Xcodeでswiftを使ったiosアプリ開発を勉強しています。

プロジェクトを「Single View App」で開始し、デフォルトのコードを理解しようとしているのですが、その中でViewプロトコルがstructで継承されていました。
これをclassで継承する(finalでないとエラーメッセージが出ていたのでfinalとしています)と、ビルドは出来るのですが実行中にエラーが発生します。

まだswiftという言語に触れたばかりでなぜ実行時にエラーになるのか分かりません。
単純にデフォルトのstructにすればエラーの解決はするのですが言語を理解する上でもなぜclass継承すると実行時にエラーになるのかの理由を知りたいです。

なぜエラーが発生するのか、またclassで継承することはできないのかお教えいただきたいです。
よろしくお願いいたします。

該当のソースコード

swift

1final class ContentView: View { 2 init() {} 3 var body: some View { 4 Text("Hello World!") 5 } 6}

他のデフォルトコードは変更していません。

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

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

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

Xcode11.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、言葉の使い方が誤っていますので指摘しておきます。

クラス定義の :の右にクラス名を指定した場合、そのクラスを「継承する(inherit)」と言いますが、クラス定義や構造体定義の :の右にプロトコル名を指定した場合、「継承する」とは言いません。プロトコルは「採用する(adopt)」と言います。

(参考)
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

クラスは、別のクラスを「継承」して新しいクラスを作ることができますが、構造体は、別のクラスや別の構造体を「継承」することはできません。プロトコルは、新しいクラスや新しい構造体に指定して「採用」することができます。

今回質問されている「View」は、「プロトコル」ですので、文法上は、自作の新しいクラスや構造体に指定して「採用」することができます。しかし、AppleはこのViewプロトコルを構造体に採用してもらうことを前提にして作っていますので、勝手にクラスに採用してもうまく動作しません。

むしろ、構造体で正しく動作しているものをどうしてclassに変更しようと思ったのかが疑問なのですが、Xcode11では、Stroryboardを使ったユーザーインターフェース構築方法(従来からの方法)とSwiftUIを使ったユーザーインターフェース構築方法(新しい方法)の2種類があることは理解されているでしょうか?

もし、それを理解していなくて、Xcode11で新しいプロジェクトを作ってそのまま実行したら「Hello World」と表示されるところまではうまくいくのだけど、そこから自分のやりたいことをやるために入門記事を読んでみたら、全てclass定義で作られているのでclassに変更しなきゃいけないのかな?と思ったのでしたら、次の記事のプロジェクト作成画面を見てください。

https://note.com/black777cat/n/n1e8acc00395d

ここに書かれてあるように、Xcode11から、プロジェクト作成時にUser Interface欄で「SwiftUI」を使うか「Stroyboard」を使うかの選択が追加されていますので、従来の方法でユーザーインターフェースを構築する方法を学びたいのであれば、「Stroyboard」を選択して下さい。新しいユーザーインターフェース構築方法に興味があって、それを使ってみたいのであれば「SwiftUI」を選択して下さい。「Storyboard」を使った方法は、UIViewControllerクラスを「継承」したクラスを作成してユーザーインターフェースを構築します。「SwiftUI」を使った方法はViewプロトコルを採用した構造体を作成してユーザーインターフェースを構築します。

投稿2019/12/26 16:04

TakeOne

総合スコア6299

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

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

kon_do

2019/12/28 14:42

ご指摘の通り「SwiftUI」でプロジェクトを開始しており「Storyboard」の存在は知りませんでした。 そちらで開始したところ私のやりたいことに合っていました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問