Я перепробовал все возможные перестановки и прочитал всевозможные документы о Swift #selectors, но ничего не добился. Вот код:

class AFSelectionState: GKComponent {
    let clearSelectionIndicator: (Set<Int>?) -> Void
    let setSelectionIndicator: (Set<Int>) -> Void

    init(setSelectionIndicator: @escaping (Set<Int>) -> Void, clearSelectionIndicator: @escaping (Set<Int>?) -> Void) {
        self.clearSelectionIndicator = clearSelectionIndicator
        self.setSelectionIndicator = setSelectionIndicator
    }
}

class GameScene: SKScene, SKViewDelegate {
    var selectionState: AFSelectionState!

    override func sceneDidLoad() {
        ...

/****************** Compiler errors coming up ****************
 **
 ** Tried #selector(setSelectionIndicator_(_:))
 ** Got "Cannot convert value of type 'Selector' to expected
 ** argument type '(Set<Int>) -> Void'"
 ** From what I've read, the above should be working, but you know
 ** how it is when people say "should".
 **
 ** Tried #selector(setSelectionIndicator_(_:) -> ())
 ** Got "Expected type before '->'".
 **
 ** Tried all sorts of other stuff. There's something about
 ** selectors that I'm missing.
 ** 
 *********************** Et cetera! *************************/

        selectionState = AFSelectionState(

            setSelectionIndicator: #selector(setSelectionIndicator_(_:)),
            clearSelectionIndicator: #selector(clearSelectionIndicator_(_:))

        )

        ...
    }
}

extension GameScene {
    @objc func setSelectionIndicator_(_ selectedIndexes: Set<Int>) -> Void {
        ...
    }

    @objc func clearSelectionIndicator_(_ indexes: Set<Int>?) -> Void {
        ...
    }
}
1
SaganRitual 30 Дек 2017 в 18:12

2 ответа

Лучший ответ

Selector - это, по сути, строка, а не закрытие, блок или любой другой фрагмент кода, который может быть выполнен. Чтобы добиться желаемого, попробуйте следующее:

selectionState = AFSelectionState(

    setSelectionIndicator: self.setSelectionIndicator_,
    clearSelectionIndicator: self.clearSelectionIndicator_

)

P.S. убедитесь, что вы не создаете ссылочный цикл с этим

3
Fyodor Volchyok 30 Дек 2017 в 16:49

Это правильный синтаксис:

selectionState = AFSelectionState(setSelectionIndicator: setSelectionIndicator_, clearSelectionIndicator: clearSelectionIndicator_)

Вы смешали селекторы и замыкания. Посмотрите ссылку:

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

2
Johannes Starke 30 Дек 2017 в 15:26