[ios] 類沒有初始化器Swift


2 Answers

快速修復 - 確保所有在創建時未被初始化的變量(例如var num : Int? vs var num = 5 )具有? 或者!

長答案(reccomended) - 按照mprivat的說明閱讀doc ...

Question

我有一個Swift類的問題。 我有一個UITableViewController類和UITableViewCell類的swift文件。 我的問題是UITableViewCell類和插座。 這個類有一個錯誤類“HomeCell”沒有初始化器 ,我不明白這個問題。

感謝您的回應。

import Foundation
import UIKit

class HomeTable: UITableViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var tableViex: UITableView!

    var items: [(String, String, String)] = [
        ("Test", "123", "1.jpeg"),
        ("Test2", "236", "2.jpeg"),
        ("Test3", "678", "3.jpeg")
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        var nib = UINib(nibName: "HomeCell", bundle: nil)
        tableView.registerNib(nib, forCellReuseIdentifier: "bookCell")
    }

    // Number row
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

    // Style Cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("bookCell") as UITableViewCell

        // Style here

        return cell

    }

    // Select row
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // Select
    }

}

// PROBLEM HERE
class HomeCell : UITableViewCell {

    @IBOutlet var imgBook: UIImageView
    @IBOutlet var titleBook: UILabel
    @IBOutlet var pageBook: UILabel

    func loadItem(#title: String, page: String, image:String) {
        titleBook.text = title
        pageBook.text = page
        imgBook.image = UIImage(named: image)
    }

}



不是你的問題的具體答案,但當我沒有為枚舉設置初始值並將其聲明為屬性時出現此錯誤。 我為枚舉分配了一個初始值來解決這個錯誤。 張貼在這裡,因為它可能有助於某人。




簡單的回答:

我的回答一般會解決錯誤,而不是OP的確切代碼。 沒有回答提到這個筆記,所以我只是想我補充一下。

下面的代碼也會產生相同的錯誤:

class Actor {
    let agent : String?
}

其他人提到, 您可以創建初始化程序,或者使其成為可選類型,使用! 要么 ? 哪個是對的。 然而,如果你有一個可選的成員/屬性,該可選應該是可變的,即var 。 如果你做出let那麼它將永遠無法擺脫它的nil狀態。 那很糟!

所以寫它的正確方法是:

選項1:

class Actor {
        var agent : String? // it has a chance so its value can be set!
}

或者你可以把它寫成:

選項2:

class Actor {
let agent : String?

init (agent: String?){
    self.agent = agent // it has a chance so its value can be set!
}
}

或者默認它為任何值(包括有點愚蠢的nil

2選項:

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}

深刻的回答:

我的回答一般會解決錯誤,而不是OP的確切代碼。 沒有回答提到這個筆記,所以我只是想我補充一下。

下面的代碼也會產生相同的錯誤:

class Actor {
    let agent : String? // BAD! // Its value is set to nil, and will always be nil and that's stupid so Xcode is saying not-accepted.  
    // Technically speaking you have a way around it🤓, you can help the compiler and enforce your value as a constant. See Option3
}

其他人提到, 您可以創建初始化程序,或者使其成為可選類型,使用! 要么 ? 哪個是對的。 然而,如果你有一個可選的成員/屬性,該可選應該是可變的,即var 。 如果你做出let那麼它將永遠無法擺脫它的nil狀態。 那很糟!

所以寫它的正確方法是:

選項1

class Actor {
    var agent : String? // It's defaulted to `nil`, but also has a chance so it later can be set to something different || GOOD!
}

或者你可以把它寫成:

選項2

class Actor {
let agent : String? // It's value isn't set to nil, but has an initializer || GOOD!

init (agent: String?){
    self.agent = agent // it has a chance so its value can be set!
    }
}

或者默認它為任何值(包括有點愚蠢的nil

2選項

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}

如果您好奇為什麼let (與var相反)未初始化nil請閱讀herehere




Related