Как мы используем NSSelectorFromString в Swift? - PullRequest
0 голосов
/ 25 августа 2018

Я не понимаю, почему это всегда терпит неудачу.Любая помощь?Видимо, я не понимаю, как NSStringFromSelector работает?Вот мой код ниже:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let selector = NSSelectorFromString("test(value:value2:)")
        if self.responds(to: selector) {
            print("it works")
        } else {
            print("it failed")
        }
    }

    func test(value: Int, value2: Int) {
    }
}

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

У вас есть пара проблем, во-первых, для работы NSSelectorFromString, сам метод, а также класс должны быть объявлены @objc Во-вторых, предпочтительный способ сделать это - использовать #selector, которыйдаст вам проверку правильности селектора во время компиляции.

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        if self.responds(to: #selector(test(value:value2:))) {
            print("it works")
        } else {
            print("it failed")
        }
    }

    @objc
    func test(value: Int, value2: Int) {

    }
}
0 голосов
/ 25 августа 2018

Неправильный формат вашей строки выбора.Строка выбора для NSSelectorFromString должна выглядеть как подпись Objective-C.

Попробуйте:

let selector = NSSelectorFromString("testWithValue:value2:")

, а ваш func должен быть помечен @objc или ваш class должен быть помечен @objcMembers.


Как получить строку селектора:

Примечание: предпочтительный способсоздать селектор в Swift - значит использовать #selector, как описано @DavidBerry в его ответе , потому что он дает вам проверку селектора во время компиляции.

Если вам все еще нужно NSSelectorFromString тогда вот как узнать строку:

После добавления @objc к вашей функции и компиляции проекта, нажмите на значок Related Items в Xcode в левом верхнем углу окнаОкно ViewController.swift и выберите Генерируемый интерфейс -> <ProjectName>-Swift.h.Там вы найдете интерфейс Objective-C вашего func:

- (void)testWithValue:(NSInteger)value value2:(NSInteger)value2;

, а затем объедините части, оканчивающиеся двоеточиями, для создания строки селектора: "testWithValue:value2:"

0 голосов
/ 25 августа 2018

Просто используйте #selector вместо

let selector = #selector(test(value:value2:))

и сделайте объявление вашей функции с @objc

@objc func test(value: Int, value2: Int) {

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...