Невозможно вызвать значение нефункционального типа 'Closure Name' - PullRequest
0 голосов
/ 17 сентября 2018

Я определяю Замыкание с именем touchBlock и использую его в override func touchesEnded, затем получаю сообщение об ошибке:

Невозможно вызвать значение нефункционального типа '((ELControl, UIEvent,UIEvent) -> Void?)?

Вот мой код:

var touchBlock: ((_ view: ELControl, _ touches: UIEvent, _ event: UIEvent) -> Void?)?    
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    if self.touchBlock != nil {

        self.touchBlock(nil, touches, event)
    } else {

        super.touchesEnded(touches, with: event)
    }
}

Пожалуйста, помогите мне исправить это.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Вы должны развернуть необязательный

self.touchBlock!(nil, touches, event)

или предпочтительный с необязательным связыванием

if let block = self.touchBlock {
   block(nil, touches, event) ...

Но учтите, что переданные аргументы совсем не соответствуют типам замыкания (view и event не являются обязательными, а тип touches совершенно другой).

0 голосов
/ 17 сентября 2018

В вашем коде необходимо обработать 2 случая.

var touchBlock: ((_ view: ELControl, _ touches: UIEvent, _ event: UIEvent) -> Void?)?   

Ваше определение блока показывает, что вы можете передавать только ненулевые значения в блок и даже в ваш блокнеобязательно.Так что @ Игорь предложил вам вызвать блок следующим образом:

self.touchBlock?(<non-nil-value>, touches, event) 

Здесь, ? пометить блоком, будет обрабатывать необязательное условие блока.

Но еслиВы хотите другую операцию, если блок равен нулю.Тогда вы можете использовать для этого условие if-let :

if let block = self.touchBlock {
    block(<non-nil-value>, touches, event)
} else {
    super.touchesEnded(touches, with: event)
}

Но, если вы также хотите передать значение nil, определите свой блок как:

// Установить ELControl для просмотра optional с ? меткой

var touchBlock: ((_ view: ELControl?, _ touches: UIEvent, _ event: UIEvent) -> Void?)?   

и вызова:

if let block = self.touchBlock {
    block(nil, touches, event)
} else {
    super.touchesEnded(touches, with: event)
}
0 голосов
/ 17 сентября 2018

Сначала вам нужно развернуть переменную замыкания. Например, вы можете использовать необязательный синтаксис цепочки (обратите внимание на знак вопроса ?, появившийся сразу после self.touchBlock внутри if statement)

var touchBlock: ((_ view: ELControl, _ touches: UIEvent, _ event: UIEvent) -> Void?)?    
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    if self.touchBlock != nil {

        self.touchBlock?(nil, touches, event)
    } else {

        super.touchesEnded(touches, with: event)
    }
}
...