我正在制作一个用于存档书籍的应用程序,当时我正要钩住一个按钮来保存数据,但我无法超越初始化。

这是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/

10-12 05:32