我正在制作一个用于存档书籍的应用程序,当时我正要钩住一个按钮来保存数据,但我无法超越初始化。
这是Xcode给我的错误:
Property 'self.bookStore' not initialised at super.init call.
这是我的代码:
import UIKit
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) {
super.init(coder: aDecoder) // Error: Property 'self.bookStore' not initialised at super.init call.
}
@IBAction func saveNewBook(sender: AnyObject) {
let author = self.bookAuthor.text!
let title = self.bookTitle.text!
bookStore.addBook(author, title: title)
println("\(bookStore)")
}
}
import UIKit
class BookStore: NSObject {
var allBooks: [Book] = []
func addBook(author: String, title: String) -> Book {
let newBook = Book(author: author, title: title)
allBooks.append(newBook)
return newBook
}
}
最佳答案
您的自定义初始化程序无法初始化不可变属性。如果希望它是不可变的,则无需创建自定义初始化程序,而只需在必需的或指定的初始化程序之一中进行初始化。
像这样,
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)
}
}
但是,在您的情况下,您希望它在使用 let bookStore:BookStore 时是不可变的,但是如果您不使用情节提要,则可以从所需的初始化程序中引发致命异常,并使用自己的初始化程序,
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()
这里的主要原理是,没有两个初始化程序可以初始化不可变属性。只有一个可以做到,因此要么使用必需的初始化程序来实例化它,要么使必需的初始化程序不可用,或者使该属性可变,以便您可以拥有两个初始化程序,并且两者都可以对其进行初始化。
关于ios - 无法找出编码器aDecoder:NSCoder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30988988/