您的自定义初始值设定项无法初始化不可变属性。如果你希望它是不可变的,那么不用创建一个自定义的初始化器,只需要在需要的或指定的初始化器之一中进行初始化。
这样,
class AddBook: UIViewController {
@IBOutlet weak var bookAuthor: UITextField!
@IBOutlet weak var bookTitle: UITextField!
let bookStore: BookStore
required init(coder aDecoder: NSCoder) {
fatalError("Cannot be instantiated from storyboard")
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
bookStore = BookStore()
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
@IBAction func saveNewBook(sender: AnyObject) {
let author = self.bookAuthor.text!
let title = self.bookTitle.text!
bookStore.addBook(author, title: title)
}
}
还是这个,
class AddBook: UIViewController {
@IBOutlet weak var bookAuthor: UITextField!
@IBOutlet weak var bookTitle: UITextField!
let bookStore: BookStore
required init(coder aDecoder: NSCoder) {
bookStore = BookStore()
super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
fatalError("Cannot be instantiated from code")
}
@IBAction func saveNewBook(sender: AnyObject) {
let author = self.bookAuthor.text!
let title = self.bookTitle.text!
bookStore.addBook(author, title: title)
}
}
但是,你的情况,你要为你使用让书店它是不可变的:图书城,但如果你是不使用故事板,您可以简单地从所需的初始化程序中抛出致命异常并使用您自己的初始化程序,
class AddBook: UIViewController {
@IBOutlet weak var bookAuthor: UITextField!
@IBOutlet weak var bookTitle: UITextField!
let bookStore: BookStore
init(bookStore: BookStore) {
self.bookStore = bookStore
super.init(nibName: nil, bundle: nil)
}
required init(coder aDecoder: NSCoder) {
fatalError("cannot be initialized from storyboard")
}
@IBAction func saveNewBook(sender: AnyObject) {
let author = self.bookAuthor.text!
let title = self.bookTitle.text!
bookStore.addBook(author, title: title)
}
}
let book = AddBook(bookStore: BookStore())
现在,你需要有必要的初始化,你必须做出财产可变的,这样你可以从这样的自定义初始化设置,
class AddBook: UIViewController {
@IBOutlet weak var bookAuthor: UITextField!
@IBOutlet weak var bookTitle: UITextField!
var bookStore: BookStore!
init(bookStore: BookStore) {
self.bookStore = bookStore
super.init(nibName: nil, bundle: nil)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
@IBAction func saveNewBook(sender: AnyObject) {
let author = self.bookAuthor.text!
let title = self.bookTitle.text!
bookStore.addBook(author, title: title)
}
}
let book = ... // initialized from storyboard or using performSegueWithIdentifier:
book.bookStore = BookStore()
主要的理念在这里,没有两个初始值设定初始化不可变属性。只有一个可以做,所以要么使用必需的初始化程序来实例化它,要么使所需的初始化程序不可用,或者使该属性可变,以便可以有两个初始化程序,并且都可以初始化它。
你需要设置'self.bookStore'之前你调用'super.init' – dan
我不明白我应该设置什么它也。 BookStore是一个包含所有书籍和添加/删除等的方法的类。 – aamck