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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Swift

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

Q&A

解決済

2回答

3769閲覧

selector の使い方

catch-try-error

総合スコア14

iOS

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Swift

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

0グッド

0クリップ

投稿2015/08/07 10:57

iOS と OS X のAppを開発しています。
Swiftのselectorの使い方がよくわかりません。
SwiftでのSelectorの使い方を検索すると,

Objective-Cの @selector(function:) は,
Swift では文字列として, "function" とか Selector("function") と書く。

とかいう記事が多いのですが,そもそも,Swiftで selector に初めて出会ったので,よくわかっていません。
Objective-C を学ぼうとして頓挫したので, Objective-C のリテラルはほとんど知りません。

selector とは,以下の選択肢のうち,どこの 関数(メゾッド) を参照できるのですか? (複数選択可)

  1. class内の隣接したメゾッド
class MyView:NSViewController { @IBOutlet weak var button:NSButton! func destination(){ // 省略 } override func viewDidLoad(){ self.button.action = Selector("destination") } }
  1. 同じオブジェクト内
class MyButton:NSButton { func destination(){ // 省略 } } class MyView:NSViewController { @IBOutlet weak var button:MyButton! override func viewDidLoad(){ self.button.action = Selector("destination") } }
  1. 外部もあり
func destination(){ // 省略 } class MyView:NSViewController { @IBOutlet weak var button:MyButton! override func viewDidLoad(){ self.button.action = Selector("destination") } }

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

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

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

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

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

guest

回答2

0

addTarget という便利なメソッドがあることに気づきました!

私は, JavaScript から始めて, Swift を使うようになったので,

JavaScript

1onclick = function(){}

的な発想で

Swift

1action = Selector("destination:")

って書いてました。今度から, addTarget 使ってみます!

投稿2015/08/07 12:41

catch-try-error

総合スコア14

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

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

0

ベストアンサー

番号で言うなら、**1.2.**ではないでしょうかね。
3は関数であって、メソッドではないので、恐らくSelectorの守備範囲外だと思います。

ただ、**1.2.**のような記述だと、それがどのクラスに定義されたメソッドなのかを特定しようがありません。どのクラスに定義されたメソッドなのかが分からないと、そのメソッドを呼ぶこともできません。
だからこそ、基本的にSelectorはオブジェクトとセットで扱われる場合が多いです。

例えばUIButtonaddTargetの引数も、Selectorとオブジェクトがセットになっています。

Swift

1class ViewController: UIViewController { 2 @IBOutlet weak var myButton: MyButton! 3 override func viewDidLoad() { 4 myButton.addTarget(self, action: Selector("buttonClicked:"), forControlEvents: UIControlEvents.TouchUpInside) 5 } 6 func buttonClicked(sender: UIButton) { 7 NSLog("Called: ViewController#buttonClicked"); 8 } 9} 10 11class MyButton: UIButton { 12 func buttonClicked(sender: UIButton) { 13 NSLog("Called: MyButton#buttonClicked") 14 } 15}

上記の場合、addTargetの第1引数にselfが指定されているので、selfつまりViewControllerクラスに定義されたbuttonClickedが呼ばれるので、出力は「Called: ViewController#buttonClicked」です。

しかし、addTargetの第1引数に指定したselfmyButtonに書き換えると、myButtonつまりMyButtonクラスに定義されたbuttonClickedが呼ばれるので、出力は「Called: MyButton#buttonClicked」に変わります。

ちなみに、nilを指定した場合は、MyButtonにおけるselfつまりMyButtonクラス自身に定義されたbuttonClickedが呼ばれるので、出力は「Called: MyButton#buttonClicked」です。


なぜ「Selectorとオブジェクトをセットで扱うのか」についてもう少し掘り下げると、
Selectorで指定したメソッドは、そのメソッドが定義されているであろうオブジェクトのperformSelectorメソッドを使うことによって呼ばれます。(SwiftではperformSelectorが使えないため、Objective-Cで書きます)
下記は、MyInstanceクラスに定義されているmyMethodというインスタンスメソッドをSelectorを利用して呼ぶコードです。

Objective

1MyInstance *myInstance = [[MyInstance alloc] init]; 2// [myInstance myMethod]; と書けばいいじゃん という突っ込みはナシでお願いします 3SEL myMethodSelector = @selector(myMethod); 4 5[myInstance performSelector:myMethodSelector];

上記のように、Selectorを利用してメソッドを呼ぶにはオブジェクトないしインスタンス(上記の場合のmyInstance)が必要なのです。セットで扱うのはそのためです。

余談ですが、もしinstancemyMethodが定義されていない場合は、「unrecognized selector sent to instance(未確認のセレクタがインスタンスに送信された)」という理由でNSInvalidArgumentExceptionが発生して、プログラムが強制終了します。

投稿2015/08/07 12:27

shiolier

総合スコア1156

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問