类没有初始化Swift
我有一个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) } }
你必须使用隐含的解包选项,这样Swift才能在初始化阶段处理循环依赖项(在这种情况下父对象的子组件)。
@IBOutlet var imgBook: UIImageView! @IBOutlet var titleBook: UILabel! @IBOutlet var pageBook: UILabel!
阅读这个文档 ,他们解释得很好。
快速修复 – 确保所有在创build时都没有被初始化的variables(例如var num : Int?
vs var num = 5
)有一个?
或!
。
长答案(reccomended) – 阅读文档按mprivatbuild议…
这是来自Apple 文档
在创build该类或结构的实例时,类和结构必须将其存储的所有属性设置为适当的初始值。 存储的属性不能处于不确定的状态。
您会收到错误消息类“HomeCell”没有初始化程序,因为您的variables处于不确定状态。 您可以创build初始化程序,也可以使其成为可选types,使用! 要么 ?
简单的回答:
我的答案通常解决错误,而不是OP的确切代码。 没有回答提到这个笔记,所以我只是想我添加它。
下面的代码也会产生相同的错误:
class Actor { let agent : String? }
其他人提到, 要么你创build初始化程序 , 要么使其成为可选types,使用! 要么 ? 哪个是对的。 然而,如果你有一个可选的成员/财产,该可选应该是可变的,即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 }
其他人提到, 要么你创build初始化程序 , 要么使其成为可选types,使用! 要么 ? 哪个是对的。 然而,如果你有一个可选的成员/财产,该可选应该是可变的,即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
请阅读这里和这里
在我的情况下,我已经宣布这样一个Bool
:
var isActivityOpen: Bool
即我宣布它没有解开所以,这是我如何解决( 没有初始值设定 )的错误:
var isActivityOpen: Bool!
不是你的问题的具体答案,但我有这个错误,当我没有设置一个枚举的初始值,同时声明它作为一个属性。 我为枚举分配了一个初始值来解决这个错误。 张贴在这里,因为它可能有助于某人。