@selektor () di Swift?


660

Saya mencoba untuk membuat NSTimerdi Swifttapi aku mengalami beberapa masalah.

NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)

test() adalah fungsi di kelas yang sama.


Saya mendapatkan kesalahan di editor:

Tidak dapat menemukan kelebihan untuk 'init' yang menerima argumen yang disediakan

Ketika saya mengubah selector: test()ke selector: nilyang menghilang kesalahan.

Saya sudah mencoba:

  • selector: test()
  • selector: test
  • selector: Selector(test())

Tetapi tidak ada yang berhasil dan saya tidak dapat menemukan solusi dalam referensi.


11
selector: test()akan memanggil testdan meneruskannya mengembalikan nilai ke selectorargumen.
Michael Dorst

Jawaban:


930

Swift sendiri tidak menggunakan penyeleksi - beberapa pola desain yang di Objective-C memanfaatkan penyeleksi bekerja berbeda di Swift. (Misalnya, gunakan rantai tambahan pada jenis protokol atau is/ aspengujian alih-alih respondsToSelector:, dan gunakan penutupan di mana pun Anda bisa, bukan performSelector:untuk keamanan jenis / memori yang lebih baik.)

Tetapi masih ada sejumlah API berbasis ObjC penting yang menggunakan penyeleksi, termasuk penghitung waktu dan pola sasaran / tindakan. Swift menyediakan Selectortipe untuk bekerja dengannya. (Swift secara otomatis menggunakan ini sebagai pengganti SELtipe ObjC .)

Di Swift 2.2 (Xcode 7.3) dan yang lebih baru (termasuk Swift 3 / Xcode 8 dan Swift 4 / Xcode 9):

Anda bisa membuat Selectordari tipe fungsi Swift menggunakan #selectorekspresi.

let timer = Timer(timeInterval: 1, target: object,
                  selector: #selector(MyClass.test),
                  userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
                 for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
             with: button, with: otherButton)

Hal hebat tentang pendekatan ini? Referensi fungsi diperiksa oleh kompiler Swift, sehingga Anda dapat menggunakan #selectorekspresi hanya dengan pasangan kelas / metode yang benar-benar ada dan memenuhi syarat untuk digunakan sebagai penyeleksi (lihat "Ketersediaan pemilih" di bawah). Anda juga bebas membuat referensi fungsi Anda hanya sespesifik yang Anda butuhkan, sesuai aturan Swift 2.2+ untuk penamaan tipe fungsi .

(Ini sebenarnya merupakan perbaikan dari @selector()arahan ObjC , karena pemeriksaan kompiler -Wundeclared-selectorhanya memverifikasi bahwa ada pemilih bernama. Referensi fungsi Swift yang Anda berikan untuk #selectormemeriksa keberadaan, keanggotaan dalam kelas, dan ketik tanda tangan.)

Ada beberapa peringatan tambahan untuk referensi fungsi yang Anda sampaikan ke #selectorekspresi:

  • Beberapa fungsi dengan nama dasar yang sama dapat dibedakan dengan label parameternya menggunakan sintaksis yang disebutkan di atas untuk referensi fungsi (misalnya insertSubview(_:at:)vs insertSubview(_:aboveSubview:)). Tetapi jika suatu fungsi tidak memiliki parameter, satu-satunya cara untuk mendamaikannya adalah dengan menggunakan asgips dengan tanda tangan tipe fungsi (misalnya foo as () -> ()vs foo(_:)).
  • Ada sintaks khusus untuk pasangan pengambil / penyetel properti di Swift 3.0+. Misalnya, diberi var foo: Int, Anda dapat menggunakan #selector(getter: MyClass.foo)atau #selector(setter: MyClass.foo).

Catatan umum:

Kasus di mana #selectortidak berfungsi, dan penamaan: Terkadang Anda tidak memiliki referensi fungsi untuk membuat pemilih dengan (misalnya, dengan metode yang terdaftar secara dinamis di runtime ObjC). Dalam kasus itu, Anda bisa membuat a Selectordari string: misalnya Selector("dynamicMethod:")- meskipun Anda kehilangan pemeriksaan validitas kompilator. Ketika Anda melakukannya, Anda harus mengikuti aturan penamaan ObjC, termasuk titik dua ( :) untuk setiap parameter.

Ketersediaan pemilih : Metode yang dirujuk oleh pemilih harus diekspos ke runtime ObjC. Dalam Swift 4, setiap metode yang diekspos ke ObjC harus memiliki deklarasi diawali dengan @objcatribut. (Dalam versi sebelumnya Anda mendapatkan atribut itu secara gratis dalam beberapa kasus, tetapi sekarang Anda harus mendeklarasikannya secara eksplisit.)

Ingatlah bahwa privatesimbol tidak terkena runtime juga - metode Anda harus memiliki setidaknya internalvisibilitas.

Jalur utama: Ini terkait tetapi tidak persis sama dengan penyeleksi. Ada sintaks khusus untuk ini di Swift 3, juga: misalnya chris.valueForKeyPath(#keyPath(Person.friends.firstName)). Lihat SE-0062 untuk detailnya. Dan lebih banyak lagi KeyPathhal-hal di Swift 4 , jadi pastikan Anda menggunakan API berbasis KeyPath yang tepat dan bukan penyeleksi jika perlu.

Anda dapat membaca lebih lanjut tentang penyeleksi di bawah Berinteraksi dengan Objective-C APIs dalam Menggunakan Swift dengan Cocoa dan Objective-C .

Catatan: Sebelum Swift 2.2, Selectorsesuaikan dengan StringLiteralConvertible, jadi Anda mungkin menemukan kode lama tempat string kosong diteruskan ke API yang mengambil pemilih. Anda akan ingin menjalankan "Konversi ke Sintaks Swift Saat Ini" di Xcode untuk mendapatkannya #selector.


8
Puting string dengan nama fungsi berfungsi, NSSelectorFromString () juga berfungsi.
Arbitur

7
Saya ingin menyebutkan bahwa sementara "Berinteraksi dengan API Objective-C" ada di situs web, BUKAN dalam buku 'Bahasa Pemrograman Swift'.

10
Ini mungkin harus menyebutkan bahwa pemilih membutuhkan ":" di akhir jika butuh argumen. (Mis. Test () -> "test" & test (ini: String) -> "test:")
Daniel Schlaug

2
Juga harus ditunjukkan bahwa kerangka kerja Kakao mengharapkan nama metode gaya Objective-C. Jika metode Anda mengambil argumen, Anda akan memerlukan ':' jika membutuhkan 2 argumen size:andShape:,, jika argumen pertama bernama Anda mungkin memerlukan With, yaitu initWithData:untukfunc init(Data data: NSData)
JMFR

6
Apakah ada cara untuk menambahkan validasi saat melewati "pemilih" sebagai string? Kompiler IE memperingatkan kita ketika kita salah mengeja, dll.
yo.ian.g

86

Berikut adalah contoh cepat tentang cara menggunakan Selectorkelas di Swift:

override func viewDidLoad() {
    super.viewDidLoad()

    var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))
    self.navigationItem.rightBarButtonItem = rightButton
}

func method() {
    // Something cool here   
}

Perhatikan bahwa jika metode yang diteruskan sebagai string tidak berfungsi, itu akan gagal saat runtime, tidak mengkompilasi waktu, dan merusak aplikasi Anda. Hati-hati


13
yang mengerikan ... apakah ada jenis "NSStringFromSelector"?
Lena Bru

11
tidak percaya mereka dirancang untuk pemilih yang tidak dicentang karena objc memiliki ini
malhal

4
@malcomhall: @selectorberguna, tetapi tidak diberlakukan secara formal seperti yang Anda pikirkan. "Selektor yang tidak dideklarasikan" hanyalah peringatan dari kompiler, karena penyeleksi baru selalu dapat diperkenalkan pada saat run time. Referensi pemilih yang dapat diverifikasi / dapat dihidupkan kembali di Swift akan menjadi permintaan fitur yang baik untuk dibuat .
rickster

2
Jawaban ini sangat membantu tetapi jawaban di bawah ini dengan @objc lebih tepat.
cynistersix

Saat Anda meneruskan string pemilih ke dalam sebagai variabel atau parameter, Anda harus membiarkan kompiler mengetahui pemilihnya menggunakan fungsi Selector (). terima kasih
levous

46

Juga, jika kelas (Swift) Anda tidak turun dari kelas Objective-C, maka Anda harus memiliki titik dua di akhir string nama metode target dan Anda harus menggunakan properti @objc dengan metode target Anda misalnya

var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

@objc func method() {
    // Something cool here   
} 

jika tidak, Anda akan mendapatkan kesalahan "Pemilih Tidak Dikenal" saat runtime.


3
1. penyeleksi dengan tanda titik dua harus mengambil argumen 2. menurut tindakan Apple dokumen waktu harus mengambil argumen NSTimer 3. Selectorkata kunci tidak wajib. Jadi dalam hal ini tanda tangan harus@objc func method(timer: NSTimer) {/*code*/}
Yevhen Dubinin

@objcbekerja untukku. Saya tidak perlu memasukkan timer: NSTimertanda tangan metode saya untuk dipanggil.
Mike Taverne

32

Swift 2.2+ dan Swift 3 Update

Gunakan #selectorekspresi baru , yang menghilangkan kebutuhan untuk menggunakan string literal membuat penggunaan lebih sedikit rawan kesalahan. Sebagai referensi:

Selector("keyboardDidHide:")

menjadi

#selector(keyboardDidHide(_:))

Lihat juga: Proposal Evolusi Swift

Catatan (Swift 4.0):

Jika menggunakan #selectorAnda harus menandai fungsi sebagai@objc

Contoh:

@objc func something(_ sender: UIButton)


26

Cepat 4.0

Anda membuat Selector seperti di bawah ini.

1. tambahkan acara ke tombol seperti:

button.addTarget(self, action: #selector(clickedButton(sender:)), for: UIControlEvents.touchUpInside)

dan fungsinya akan seperti di bawah ini:

@objc func clickedButton(sender: AnyObject) {

}

4
Anda lupa meletakkan @objcsebelumnya funcyang diperlukan dalam Swift 4.
Vahid Amiri

24

Untuk pembaca masa depan, saya menemukan bahwa saya mengalami masalah dan mendapatkan unrecognised selector sent to instancekesalahan yang disebabkan oleh menandai targetfunc sebagai pribadi.

The func HARUS dapat dilihat secara publik untuk dipanggil oleh objek dengan referensi ke pemilih.


13
tidak harus bersifat publik, Anda masih dapat merahasiakan metode ini tetapi tambahkan objcsebelum deklarasi. Mis: @objc private func foo() { ...maka Anda dapat menggunakan "foo"selektor sebanyak yang Anda suka
apouche

Bisa juga internal, dengan demikian tidak menentukan pengubah akses apa pun. Saya sering menggunakan pola ini://MARK: - Selector Methods\n extension MyController {\n func buttonPressed(_ button: UIButton) {
Sajjon

19

Kalau-kalau ada orang lain yang memiliki masalah yang sama dengan NSTimer di mana tidak ada jawaban lain yang memperbaiki masalah ini, sangat penting untuk menyebutkan bahwa, jika Anda menggunakan kelas yang tidak mewarisi dari NSObject baik secara langsung atau jauh di dalam hierarki ( mis. file swift yang dibuat secara manual), tidak ada jawaban lain yang akan berfungsi walaupun ditentukan sebagai berikut:

let timer = NSTimer(timeInterval: 1, target: self, selector: "test", 
                    userInfo: nil, repeats: false)
func test () {}

Tanpa mengubah apa pun selain membuat kelas mewarisi dari NSObject saya berhenti mendapatkan kesalahan "Selektor tidak dikenal" dan membuat logika saya berfungsi seperti yang diharapkan.


Masalah dengan alternatif ini adalah bahwa Anda tidak dapat mengubah kelas (katakanlah ViewController) untuk mewarisi dari NSObject, mengingat bahwa Anda memerlukan hal-hal yang diimplementasikan oleh kelas ViewController (misalnya viewDidLoad ()). Ada ide bagaimana memanggil fungsi Swift dalam ViewController menggunakan NSTimer? ... e
eharo2

1
UIViewController sudah mewarisi dari NSObject, sebagian besar kelas yang diekspos oleh SDK, contoh ini untuk kelas Anda sendiri yang membutuhkan fungsionalitas NSTimer ...
Martin Cazares

14

Jika Anda ingin melewatkan parameter ke fungsi dari NSTimer maka berikut ini solusinya:

var somethingToPass = "It worked"

let timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "tester:", userInfo: somethingToPass, repeats: false)

func tester(timer: NSTimer)
{
    let theStringToPrint = timer.userInfo as String
    println(theStringToPrint)
}

Sertakan titik dua dalam teks pemilih (tester :), dan parameter Anda masuk ke userInfo.

Fungsi Anda harus menggunakan NSTimer sebagai parameter. Kemudian cukup ekstrak userInfo untuk mendapatkan parameter yang lulus.


3
Saya menggunakan NSTimer (0,01, target: self, ...) yang TIDAK bekerja, sedangkan menggunakan NSTimer.scheduledTimerWithTimeInterval (0,01, ..) DID berfungsi !? Aneh tapi terima kasih @ Skuter atas jawaban Anda!
iOS-Coder

1
@ iOS-Coder hanya membuat pengatur waktu dengan penginisialisasi tidak menambahkannya ke runloop, sedangkan scheduledTimerWith...secara otomatis menambahkannya ke runloop saat ini - jadi tidak ada perilaku aneh di sini sama sekali;)
David Ganster

1
@ David terima kasih atas saran Anda. Saya kira kesalahpahaman saya seharusnya termasuk dalam kategori STFW atau RTFA (Read The F ... ing API)?
iOS-Coder

1
Jangan khawatir tentang hal itu, tidak ada yang bisa diharapkan untuk membaca dokumentasi tentang setiap metode tunggal di setiap API;)
David Ganster

10

Selektor adalah representasi internal dari nama metode di Objective-C. Dalam Objective-C "@selector (methodName)" akan mengubah metode kode sumber menjadi tipe data SEL. Karena Anda tidak dapat menggunakan sintaks pemilih di Swift (rickster ada di sana), Anda harus secara manual menentukan nama metode sebagai objek String secara langsung, atau dengan meneruskan objek String ke tipe Selector. Berikut ini sebuah contoh:

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:"logout"
)

atau

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:Selector("logout")
)

8

Swift 4.1
Dengan sampel gerakan tap

let gestureRecognizer = UITapGestureRecognizer()
self.view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.addTarget(self, action: #selector(self.dismiss(completion:)))

// Use destination 'Class Name' directly, if you selector (function) is not in same class.
//gestureRecognizer.addTarget(self, action: #selector(DestinationClass.dismiss(completion:)))


@objc func dismiss(completion: (() -> Void)?) {
      self.dismiss(animated: true, completion: completion)
}

Lihat dokumen Apple untuk detail lebih lanjut tentang: Ekspresi Selektor


Tolong berhenti melakukan ini. Itu tidak membantu siapa pun. Apa bedanya dengan Swift 3.1? Dan mengapa menurut Anda perlu menambahkan jawaban lain untuk ini ketika sudah memiliki sekitar 20 jawaban?
Fogmeister

pemilih panggilan berbeda dalam swift 4. Coba jawaban ini di swift 4 dan lihat. Tidak ada yang akan bekerja tanpa mengedit. Tolong jangan tandai pernyataan apa pun sebagai spam tanpa memastikan impotansinya
Krunal

Jadi, adakah alasan Anda tidak dapat mengedit jawaban yang ada dan diterima? Itu akan membuatnya benar-benar berguna daripada menambahkan pada akhir daftar panjang jawaban. Tombol "Edit" ada karena suatu alasan.
Fogmeister

Juga, bagian mana dari ini yang berbeda dari Swift 3?
Fogmeister

2
Anda harus menambahkan tag objc ke pemilih untuk Swift 4. Ini adalah jawaban yang benar. Dan Anda tidak seharusnya mengedit jawaban orang lain untuk mengubah artinya. @ Kwrunal sepenuhnya benar.
Unome

6
// for swift 2.2
// version 1
buttton.addTarget(self, action: #selector(ViewController.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(ViewController.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 2
buttton.addTarget(self, action: #selector(self.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(self.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 3
buttton.addTarget(self, action: #selector(tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(tappedButton2(_:)), forControlEvents: .TouchUpInside)

func tappedButton() {
  print("tapped")
}

func tappedButton2(sender: UIButton) {
  print("tapped 2")
}

// swift 3.x
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton) {
  // tapped
}

button.addTarget(self, action: #selector(tappedButton(_:_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton, _ event: UIEvent) {
  // tapped
}

akan lebih baik dan lebih mendidik jika Anda memiliki contoh mengambil dua atau tiga argumen untuk Swift3 atau Swift4 juga. Terima kasih.
nyxee

5
Create Refresh control using Selector method.   
    var refreshCntrl : UIRefreshControl!
    refreshCntrl = UIRefreshControl()
    refreshCntrl.tintColor = UIColor.whiteColor()
    refreshCntrl.attributedTitle = NSAttributedString(string: "Please Wait...")
    refreshCntrl.addTarget(self, action:"refreshControlValueChanged", forControlEvents: UIControlEvents.ValueChanged)
    atableView.addSubview(refreshCntrl)

// Segarkan Metode Kontrol

func refreshControlValueChanged(){
    atableView.reloadData()
    refreshCntrl.endRefreshing()

}

5

Sejak Swift 3.0 diterbitkan, bahkan sedikit lebih halus untuk menyatakan targetAction yang sesuai

class MyCustomView : UIView {

    func addTapGestureRecognizer() {

        // the "_" is important
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyCustomView.handleTapGesture(_:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        addGestureRecognizer(tapGestureRecognizer)
    }

    // since Swift 3.0 this "_" in the method implementation is very important to 
    // let the selector understand the targetAction
    func handleTapGesture(_ tapGesture : UITapGestureRecognizer) {

        if tapGesture.state == .ended {
            print("TapGesture detected")
        }
    }
}

4

Ketika menggunakan performSelector()

/addtarget()/NStimer.scheduledTimerWithInterval() metode metode Anda (cocok dengan pemilih) harus ditandai sebagai

@objc
For Swift 2.0:
    {  
        //...
        self.performSelector(“performMethod”, withObject: nil , afterDelay: 0.5)
        //...


    //...
    btnHome.addTarget(self, action: “buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    //...

    //...
     NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector : “timerMethod”, userInfo: nil, repeats: false)
    //...

}

@objc private func performMethod() {}
@objc private func buttonPressed(sender:UIButton){.
}
@objc private func timerMethod () {.
}

Untuk Swift 2.2, Anda perlu menulis '#selector ()' alih-alih nama string dan selector sehingga kemungkinan kesalahan ejaan dan kerusakan karena itu tidak akan ada lagi. Di bawah ini adalah contohnya

self.performSelector(#selector(MyClass.performMethod), withObject: nil , afterDelay: 0.5)

3

Anda membuat Selector seperti di bawah ini.
1.

UIBarButtonItem(
    title: "Some Title",
    style: UIBarButtonItemStyle.Done,
    target: self,
    action: "flatButtonPressed"
)

2.

flatButton.addTarget(self, action: "flatButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)

Perhatikan bahwa sintaks @selector hilang dan diganti dengan String sederhana yang menamai metode yang akan dipanggil. Ada satu area di mana kita semua bisa menyetujui verbositas menghalangi. Tentu saja, jika kita menyatakan bahwa ada metode target yang disebut flatButtonPressed: lebih baik kita menulis satu:

func flatButtonPressed(sender: AnyObject) {
  NSLog("flatButtonPressed")
}

atur timer:

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
                    target: self, 
                    selector: Selector("flatButtonPressed"), 
                    userInfo: userInfo, 
                    repeats: true)
    let mainLoop = NSRunLoop.mainRunLoop()  //1
    mainLoop.addTimer(timer, forMode: NSDefaultRunLoopMode) //2 this two line is optinal

Agar lengkap, inilah flatButtonPressed

func flatButtonPressed(timer: NSTimer) {
}

Apakah Anda memiliki sumber untuk " Perhatikan bahwa sintaks pemilih @ sudah tidak ada "?
winklerrr

3

Saya menemukan banyak jawaban ini sangat membantu tetapi tidak jelas bagaimana melakukan ini dengan sesuatu yang bukan tombol. Saya menambahkan pengenal isyarat ke dalam UILabel dengan cepat dan berjuang sehingga inilah yang saya temukan bekerja untuk saya setelah membaca semuanya di atas:

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: "labelTapped:")

Di mana "Pemilih" dinyatakan sebagai:

func labelTapped(sender: UILabel) { }

Perhatikan bahwa ini bersifat publik dan saya tidak menggunakan sintaks Selector () tetapi dimungkinkan untuk melakukan ini juga.

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: Selector("labelTapped:"))

3

Menggunakan #selector akan memeriksa kode Anda pada waktu kompilasi untuk memastikan metode yang ingin Anda panggil benar-benar ada. Bahkan lebih baik, jika metode ini tidak ada, Anda akan mendapatkan kesalahan kompilasi: Xcode akan menolak untuk membangun aplikasi Anda, sehingga membuang sumber bug lain yang mungkin ada.

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem =
            UIBarButtonItem(barButtonSystemItem: .Add, target: self,
                            action: #selector(addNewFireflyRefernce))
    }

    func addNewFireflyReference() {
        gratuitousReferences.append("Curse your sudden but inevitable betrayal!")
    }

2

Mungkin berguna untuk mencatat di mana Anda mengatur kontrol yang memicu tindakan penting.

Misalnya, saya telah menemukan bahwa ketika mengatur UIBarButtonItem, saya harus membuat tombol di dalam viewDidLoad atau saya akan mendapatkan pengecualian pemilih yang tidak dikenal.

override func viewDidLoad() {
    super.viewDidLoad() 

    // add button
    let addButton = UIBarButtonItem(image: UIImage(named: "746-plus-circle.png"), style: UIBarButtonItemStyle.Plain, target: self, action: Selector("addAction:"))
    self.navigationItem.rightBarButtonItem = addButton
}

func addAction(send: AnyObject?) {     
    NSLog("addAction")
}

1

Ubah sebagai penamaan string sederhana dalam metode yang memanggil sintaks pemilih

var timer1 : NSTimer? = nil
timer1= NSTimer(timeInterval: 0.1, target: self, selector: Selector("test"), userInfo: nil, repeats: true)

Setelah itu, ketik tes func ().


1

selectoradalah kata dari Objective-Cdunia dan Anda dapat menggunakannya dari Swiftmemiliki kemungkinan untuk menelepon Objective-Cdari Swift itu memungkinkan Anda untuk mengeksekusi beberapa kode saat runtime

Sebelum Swift 2.2sintaksnya adalah:

Selector("foo:")

Karena nama fungsi dilewatkan Selectorsebagai parameter String ("foo"), tidak mungkin untuk memeriksa nama dalam waktu kompilasi . Akibatnya, Anda bisa mendapatkan kesalahan runtime:

unrecognized selector sent to instance

Setelah Swift 2.2+sintaksnya adalah:

#selector(foo(_:))

Pelengkapan otomatis Xcode membantu Anda memanggil metode yang tepat


0

Untuk Swift 3

// Kode sampel untuk membuat timer

Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)

WHERE
timeInterval:- Interval in which timer should fire like 1s, 10s, 100s etc. [Its value is in secs]
target:- function which pointed to class. So here I am pointing to current class.
selector:- function that will execute when timer fires.

func updateTimer(){
    //Implemetation 
} 

repeats:- true/false specifies that timer should call again n again.

0

Pemilih dalam Swift 4:

button.addTarget(self, action: #selector(buttonTapped(sender:)), for: UIControlEvents.touchUpInside)

-1

Untuk cepat 3

let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.test), userInfo: nil, repeats: true)

Deklarasi fungsi di kelas yang sama:

@objc func test()
{
    // my function
} 

Jika target adalah diri, maka tidak perlu ada selfpemilih. Ini seharusnya cukup:let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(test), userInfo: nil, repeats: true)
Mithra Singam
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.