I am getting Property 'self.item' not initialized at super.init call error below at 10 and 14. For example, when I use a string as a property observer and init that string I don't get any error. However here the reason I am using a property observer is I would like to set the value for item property in runtime and automatically get that to call setupView() and I have to use my custom Type and I cannot init before runtime. I included Term Struct in the snippet for some context.
class ChoiceView: UIView {
var item: Term {
didSet {
setupView()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
protocol Term {
var value: String { get }
}
extension Term {}
struct Statement {
var terms: [Term] = []
mutating func addItem(term: Term) {
terms.append(term)
}
}
struct Fraction: Term {
let numerator: Statement
let denominator: Statement
let value: String
}
struct Exponent: Term {
let base: String
let power: Statement
let value: String
}
struct Variable: Term {
let value: String
}
struct Operator: Term {
let value: String
}
struct Number: Term {
let value: String
}
Am I better of just using a computed property? That doesn't sound right to me. Please see below:
var item: Term {
get {
setupView()
}
}
What am I missing here?
EDIT: To clarify the question: since Term is protocol, I cannot simply do:
var item: Term = Term() {
didSet {
setupView()
}
The compiler tells me 'Term' cannot be constructed because it has no accessible initializers.
I could do something like this:
var item: Term = Script(name"") {
didSet {
setupView()
}
and this indeed compiles but it's so ugly looking. Isn't there a better way to write this?
Thanks in advance.