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

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

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

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

Q&A

解決済

2回答

3983閲覧

swiftにて、プロトコル内で宣言したoptionalメソッドについて

HURONT

総合スコア42

Swift

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

0グッド

0クリップ

投稿2016/09/17 05:36

少し前に販売された参考書を使用しているため、現在のswift仕様と違っているのか、参考書と同じ記述をしてもエラーが表示されます。
プロトコルについての箇所なのですが
通常の「批准したら実装しなければならいメソッド」と違い「批准しても実装しなくていいメソッド」として
オプショナルなメソッドをプロトコル内で宣言するプログラムです。
(コード内容は少し変えてあります)

swift

1// 通常のプロトコル 2import UIKit 3 4protocol testProtocol { 5 func calc() 6} 7 8class Test: testProtocol { 9 func calc() { 10 print(2 * 2) 11 } 12} 13 14var test = Test() 15test.calc()

実行結果: 4


上記まで動くのですが、次のようにoptionalメソッドを追加する記述をするとエラーが表示されます。

swift

1//オプショナルメソッドを利用したプロトコル 2import UIKit 3 4protocol testProtocol { 5 func calc() 6 // 加えた部分。この行がエラーになる 7 optional func calc2() 8} 9 10↓以下同文

エラー: 'optional' can only be applied to members of an @objc protocol


参考書ではこのようにプロトコル内で
「optional func メソッド名()」
のように、optional修飾子を記述すればそのメソッドの実装は選択可能となり、クラス内で実装してもしなくてもいいと書かれているのですが、上記のエラーが表示されます。

調べてみると「@objc protocol プロトコル名」と記述すればいいと載っていたので、その通り書き加えました。
すると今度は、プロトコルの部分ではエラーにならなかったのですが、その次の「testProtocolプロトコル」を批准した「Testクラス」の箇所で下記のようなエラーが表示されました。

swift

1import UIKit 2 3@objc protocol testProtocol { 4 func calc() 5 optional func calc2() 6} 7 8// ここでエラー発生 9class Test: testProtocol { 10 func calc() { 11 print(2 * 2) 12 } 13} 14 15var test = Test() 16test.calc()

エラー: Type 'Test' does not coform to protocol 'testProtocol'


意味は「プロトコルで宣言したメソッドが定義されていない場合に発生するエラー」のようなのですが、それを省略するためにoptional修飾子をつけた筈なので、どこをどう直せばいいのかよくわかりません。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

// ここでエラー発生
class Test: testProtocol {
func calc(){
print(2 * 2)
}
}

のところを

// ここでエラー発生
class Test: testProtocol {
@objc func calc(){
print(2 * 2)
}
}

となさってみてください。詳細は

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

こちらの公式サイトの"Optional Protocol Requirements"の項をご参照ください。

投稿2016/09/17 06:41

編集2016/09/17 06:59
Unixer

総合スコア143

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

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

HURONT

2016/09/17 10:14

ありがとうございます。成功しました。
guest

0

testProtocol@objcを付けた場合、以下のようにTestクラスをNSObjectを継承したクラスにしてください。

swift

1class Test:NSObject, testProtocol { 2 func calc() { 3 print(2 * 2) 4 } 5}

投稿2016/09/17 06:27

_Kentarou

総合スコア8490

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

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

HURONT

2016/09/17 10:14

ありがとうございます。無事にできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問