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

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

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

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

Swift

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

Q&A

解決済

1回答

7479閲覧

[Swift] delegate実装でのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

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

Swift

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

0グッド

1クリップ

投稿2015/08/20 20:23

編集2015/08/21 12:03

お世話になります。

swiftにて以下のようにdelegateを実装しようとしているのですが、なぜか"unexpectedly found nil while unwrapping an Optional value"というエラーになってしまう理由をおしえて頂きたいです。

コードは以下になります。

swift

1 2protocol TestDelegate { 3 func sayHello() 4} 5 6class A { 7 8... 9 10 var delegate: TestDelegate! // nil 11 12... 13 14 func onClickButton() { 15 self.delegate.sayHello() 16 // unexpectedly found nil while unwrapping an Optional value 17 } 18 19} 20 21class B: TestDelegate { 22 23... 24 25 let a = A() 26 a.delegate = self 27 28... 29 30 func sayHello() { 31 println("hello") 32 } 33 34}

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

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

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

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

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

guest

回答1

0

ベストアンサー

unexpectedly found nil while unwrapping an Optional valueはnilをunwrapしようとして出ているものっぽいです。
delegateはセットするまではnilなので

var delegate: TestDelegate!

のところを

var delegate: TestDelegate?

にして

self.delegate.sayHello()

のところを

self.delegate?.sayHello()

にするといかがでしょうか?
(このソース中にはAのdelegateにBをセットするところは載っていませんがどっかでやっていると仮定して)

投稿2015/08/21 07:23

jollyjoester

総合スコア1585

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

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

退会済みユーザー

退会済みユーザー

2015/08/21 12:09 編集

試みてみたのですが、エラーは出現しないのですが、self.delegate?.sayHello() のブレークポイントではself.delegateはnilになっており、sayHello()が実行されません。 ※失礼しました。delegateのセット部分の記述を失念しておりました。追記いたしました
退会済みユーザー

退会済みユーザー

2015/08/21 12:09 編集

ソースコード修正
jollyjoester

2015/08/21 17:50

delegateをセットしているのがBの中というのがちょっと怪しいです。掲載のソースコードではわかりませんがその時点でBのインスタンスはできているのでしょうか? TestDelegate?のところがTestDelegate!になっていてdelegateがnilだと同じエラーがでますのでdelegateにちゃんとBをセットできていないんだと思います。 なお ``` protocol TestDelegate { func sayHello() } class AAA { var delegate: TestDelegate? func onClickButton() { self.delegate?.sayHello() } } class BBB : TestDelegate { func sayHello() { println("hogehoge") } } ``` のように定義して ``` class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() var aaa = AAA() aaa.delegate = BBB() aaa.onClickButton() } } ``` のようにしてみるとちゃんと動きました。 ご参考まで
退会済みユーザー

退会済みユーザー

2015/08/24 21:57

ありがとうございました!ECSlidingViewControllerというライブラリを使用しており、スライドパネルのViewからトップのViewに対してdelegateを発行したかったのですが、回答者様のおっしゃるとおり、インスタンスがちゃんと生成できていないのが原因のようでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問