类没有初始化程序


181

我对Swift类有疑问。我有一个UITableViewController类和UITableViewCell类的快捷文件。我的问题是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)
    }

}

您是否需要将nib变量的类型明确声明为可选的UINib?
Cocoadelica 2015年

Answers:


257

您必须使用隐式解开的可选参数,以便Swift可以在初始化阶段处理循环依赖关系(在这种情况下,UI组件的父级<->子级)。

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

阅读此文档,他们会很好地解释所有内容。


21
您的解释以及该文档对我来说都是有意义的,但错误消息却没有!
coco

4
对于苹果公司来说,这可能是个问题
mprivat 2015年

@IBOutlets也应标记为弱,以避免保留周期。
丹尼斯·帕什科夫

@Dennis Pashkov据我所知,它仅适用于viewController的视图层次结构中的IBOutlets。否则它将立即被释放,因为没有人持有它。
Alston

3
我在使用定义Bool时遇到了这个问题var myBool: Bool
jungledev '16

96

快速修复-确保创建时未初始化的所有变量(例如var num : Int?vs var num = 5)都带有a ?!

长答案(推荐)- 按照mprivat的建议阅读文档 ...


要解决此错误,您需要设置默认值?变量,例如:let showUserPointViewDelegate:ShowUserPointsViewControllerControl?=零
弗拉基米尔·沃多拉斯基

+1 ?表示可能为零,但如果为+1 ,则前进并什么也不做就没有问题。!表示如果解包后它为nil,然后崩溃(两者都满足启动要求),则通过通知编译器来解决:我知道/希望它将从nil开始。
亲爱的

搜索varlet在您的视图控制器中查找丢失的!s和?s
Wiingaard

33

这是来自Apple Doc

类和结构必须在创建该类或结构的实例时将其所有存储的属性设置为适当的初始值。存储的属性不能处于不确定状态。

您收到错误消息类“ HomeCell”没有初始化程序,因为您的变量处于不确定状态。您可以使用创建初始值设定项或将其设置为可选类型。要么 ?


32

我的回答是针对一般错误,而不是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有点愚蠢的值)

选项3

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

如果您对为什么未初始化let(与相反var)感到好奇,nil在此处此处阅读


2
感谢您添加此内容,因为它是图片的关键部分。
吉姆(Jim)

好解释!
马亨德拉

1
设置为nil并不愚蠢,而是多少模型可以使用的固有特性。
画了..

@drew ..设置不变的东西nil是非常错误的。设置varnil是另一回事。
蜂蜜

嘿,亲爱的,谁在和不可变的对象说话?
画了..

10

就我而言,我已经声明了Bool这样的内容:

var isActivityOpen: Bool 

即我没有展开就声明了它,所以,这就是我解决(no initializer)错误的方法:

var isActivityOpen: Bool!

1

不是您问题的具体答案,但是当我没有将枚举声明为属性时为枚举设置初始值时出现此错误。我为枚举分配了一个初始值来解决此错误。在此处发布信息可能会有所帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.