Быстрая альтернатива ответам:

Я пытался реализовать быструю альтернативу синтаксису respondsToSelector:, который также был показан в основной записи.

У меня есть следующее:

protocol CustomItemTableViewCellDelegate {
    func changeCount(sender: UITableViewCell, change: Int)
}

а затем в коде, который я вызываю

class CustomItemTableViewCell: UITableViewCell {

   var delegate: CustomItemTableViewCellDelegate
   ...
   override func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) {
      ...
      delegate?.changeCount?(self, change: -1)
   }
   ...
}

Я получаю следующие ошибки:

  • Operand of postfix '?' should have optional type; type is '(UITableViewCell, change:Int) -> ()'
  • Operand of postfix '?' should have optional type; type is 'CustomItemTableViewCellDelegate'
  • Partial application of protocol method is not allowed

Что я делаю неправильно?

Спасибо

Ответ 1

У вас есть два оператора ?, и они оба вызывают проблемы.

Во-первых, после delegate указывает, что вы хотите развернуть необязательное значение, но ваше свойство delegate не объявлено таким образом. Это должно быть:

var delegate: CustomItemTableViewCellDelegate?

Во-вторых, похоже, что вы хотите, чтобы ваш метод протокола changeCount был необязательным. Если вы это сделаете, вам нужно как пометить протокол атрибутом @objc, так и пометить функцию атрибутом optional:

@objc protocol CustomItemTableViewCellDelegate {
    optional func changeCount(sender: UITableViewCell, change: Int)
}

( Примечание.. Классы, соответствующие протоколам @objc, должны быть @objc сами. В этом случае вы подклассифицируете класс Objective-C, поэтому вы охвачены, но новый класс должен быть отмечен атрибутом @objc.)

Если вы хотите, чтобы делегат был необязательным (то есть, у него не было делегата, но всем делегатам необходимо реализовать changeCount), а затем оставить свой протокол как есть и изменить этот вызов метода:

delegate?.changeCount(self, change: -1)

Ответ 2

Ошибка говорит все.

Вы используете ? для явного типа, он не может быть nil, поэтому просто не используйте ? для этой переменной.

Если у вас есть var, как этот

var changeCount: Int

или

var changeCount = 3

У вас есть явный тип. Когда запрашивается явный тип, вы должны указать явный тип, который changeCount, а не changeCount?.

Если вам нужна дополнительная переменная, объявите ее с помощью ?:

var changeCount: Int?

Вы не можете использовать буквенный синтаксис с необязательным типом, если тип должен быть неявным. Поскольку 3 всегда является явным Int, если не указано иначе.