У меня есть атрибут класса, который указывает на одну из функций класса. Однако, когда я пытаюсь инициализировать эту переменную с помощью одной из функций, я получаю следующую ошибку:
'self' используется в вызове метода перед инициализацией всех сохраненных свойств.
Я могу инициализировать любую другую переменную для этих функций, но из-за ошибки звучит так, будто я вызываю функцию, хотя я и не являюсь.
import UIKit
import AudioToolbox
class BeatMaker {
// iPhone 7 and up use beat function, iPhone 6s use beatFallback
let hapticFunction: () -> ()
let impactGenerator = UIImpactFeedbackGenerator.init(style: .heavy)
init(supportsImpactGenerator: Bool) {
// error 1: 'self' used in method call 'beat' before all stored properties are initialized
// error 2: 'self' used in method call 'beatFallback' before all stored properties are initialized
self.hapticFunction = (supportsImpactGenerator) ? beat : beatFallback
}
private func beat() {
impactGenerator.impactOccurred()
}
private func beatFallback() {
AudioServicesPlaySystemSound(1520)
}
func makeABeat() {
hapticFunction()
}
}
В этом конкретном случае я хочу использовать Taptic Engine и симулировать клик через UIImpactFeedbackGenerator
. IPhone 6s не поддерживает этот движок, поэтому я хочу вызвать резервную функцию, которая производит аналогичный эффект.
Я также попытался инициализировать переменную на месте:
// this works
var hapticFunction: (BeatMaker) -> () -> () = beat
init(supportsImpactGenerator: Bool) {
if !supportsImpactGenerator {
// error: Cannot assign value of type '() -> ()' to type '(BeatMaker) -> () -> ()'
self.hapticFunction = beatFallback
// produces same error
self.hapticFunction = beatFallback.self
}
}
Я знаю, что я мог бы сделать все статичным или исключить все из класса, но это чувствует, что должно работать, но это не так. Я что-то упустил?
EDIT
Установка типа типа hapticFunction
на необязательное значение работает, но для меня это не имеет никакого смысла. Какая разница?
// this works
var hapticFunction: (() -> ())?
init(supportsImpactGenerator: Bool) {
self.hapticFunction = (supportsImpactGenerator) ? beat : beatFallback
}