我正在使用来自github的这个开源项目:https://github.com/barnaclejive/FaceTrigger
我无法解决子类中的错误:
错误:在'super.init'调用之前,方法调用'onBoth'中使用了'self'
class BrowDownEvaluator: BothEvaluator {
func onBoth(delegate: FaceTriggerDelegate, newBoth: Bool) {
delegate.onBrowDownDidChange?(browDown: newBoth)
if newBoth {
delegate.onBrowDown?()
}
}
func onLeft(delegate: FaceTriggerDelegate, newLeft: Bool) {
}
func onRight(delegate: FaceTriggerDelegate, newRight: Bool) {
}
init(threshold: Float) {
super.init(threshold: threshold, leftKey: .browDownLeft, rightKey: .browDownRight, onBoth: onBoth, onLeft: onLeft, onRight: onRight)
}
}
父类:
class BothEvaluator: FaceTriggerEvaluatorProtocol {
private let threshold: Float
private let leftKey: ARFaceAnchor.BlendShapeLocation
private let rightKey: ARFaceAnchor.BlendShapeLocation
private var onBoth: (FaceTriggerDelegate, Bool) -> Void
private var onLeft: (FaceTriggerDelegate, Bool) -> Void
private var onRight: (FaceTriggerDelegate, Bool) -> Void
private var oldLeft = false
private var oldRight = false
private var oldBoth = false
init(threshold: Float,
leftKey: ARFaceAnchor.BlendShapeLocation ,
rightKey: ARFaceAnchor.BlendShapeLocation ,
onBoth: @escaping (FaceTriggerDelegate, Bool) -> Void,
onLeft: @escaping (FaceTriggerDelegate, Bool) -> Void,
onRight: @escaping (FaceTriggerDelegate, Bool) -> Void)
{
self.threshold = threshold
self.leftKey = leftKey
self.rightKey = rightKey
self.onBoth = onBoth
self.onLeft = onLeft
self.onRight = onRight
}
我知道我必须在这里初始化onBoth和其余方法,但是如何初始化方法?我还在学习Swift。
答案 0 :(得分:1)
即使在允许引用self.methodName
的情况下也不应将实例方法设置为实例属性,这会导致引用循环。
一个简单的解决方法是这样的:
class BrowDownEvaluator: BothEvaluator {
static func onBoth(delegate: FaceTriggerDelegate, newBoth: Bool) {
delegate.onBrowDownDidChange?(browDown: newBoth)
if newBoth {
delegate.onBrowDown?()
}
}
static func onLeft(delegate: FaceTriggerDelegate, newLeft: Bool) {
}
static func onRight(delegate: FaceTriggerDelegate, newRight: Bool) {
}
init(threshold: Float) {
super.init(threshold: threshold, leftKey: .browDownLeft, rightKey: .browDownRight,
onBoth: BrowDownEvaluator.onBoth,
onLeft: BrowDownEvaluator.onLeft,
onRight: BrowDownEvaluator.onRight)
}
}
如果您要访问self
作为BrowDownEvaluator
的实例,事情会变得更加复杂。