类没有初始值设定项 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)
}


}
145288 次浏览

您必须使用隐式取消包装选项,以便 Swift 能够在初始化阶段处理循环依赖关系(在本例中为 UI 组件的父级 <-> 子级)。

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

读读这个 医生,他们会很好地解释一切。

快速修复-确保所有变量没有得到初始化时,他们创建(如 var num : Int?var num = 5)有一个 ?!

长答案(推荐)-阅读 医生,根据私人建议..。

这是来自苹果 医生

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

您得到错误消息 类“ HomeCell”没有初始化器,因为您的变量处于不确定状态。您可以创建初始值设定项,也可以使用!还是?

我的回答是一般性的错误,而不是 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,那么读一读 给你给你

对于您的问题,我没有给出具体的答案,但是在声明枚举为属性时,我没有为枚举设置初始值,因此出现了这个错误。我为枚举指定了一个初始值来解决这个错误。 发布在这里可能会对某人有帮助。

在我的例子中,我声明了这样的 Bool:

var isActivityOpen: Bool

也就是说,我没有展开它就声明了它,这就是我解决(没有初始化程序)错误的方法:

var isActivityOpen: Bool!

只需为 家庭牢房类提供 init 块

这是我的工作