Быстрая альтернатива ответам:
Я пытался реализовать быструю альтернативу синтаксису 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, если не указано иначе.