Class 没有初始值设定项 Swift
Class has no initializers Swift
我对 Swift class 有疑问。我有一个用于 UITableViewController class 和 UITableViewCell class 的 swift 文件。我的问题是 UITableViewCell class 和 outlets。这个class有错误Class "HomeCell" has no initializers,我不明白这个问题
感谢您的回复。
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 可以在初始化阶段处理循环依赖(在本例中为 UI 组件的父 <-> 子)。
@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!
阅读这个 doc,他们解释得很好。
快速修复 - 确保所有在创建时未初始化的变量(例如 var num : Int?
与 var num = 5
)具有 ?
或 !
。
长答案(推荐)- 按照 mprivat 的建议阅读 doc...
这是来自 Apple doc
Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.
您收到错误消息 Class "HomeCell" has no initializers 因为您的变量处于不确定状态。要么创建初始值设定项,要么使它们成为可选类型,使用 !或者?
我的回答解决了一般错误,而不是 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
}
其他人提到 要么创建初始值设定项,要么将它们设为可选类型,使用 !或 ? 是正确的。然而,如果你有一个可选的member/property,那个可选的应该是可变的,即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
,请阅读 and
不是您问题的具体答案,但是当我在将枚举声明为 属性 时没有为枚举设置初始值时出现此错误。我为枚举分配了一个初始值以解决此错误。
在这里发帖,因为它可能会对某人有所帮助。
在我的例子中,我声明了一个 Bool
这样的:
var isActivityOpen: Bool
即我在没有展开的情况下声明了它,这就是我解决 (no initializer) 错误的方法:
var isActivityOpen: Bool!
只需为 HomeCell class
提供初始化块
对我来说很管用
我对 Swift class 有疑问。我有一个用于 UITableViewController class 和 UITableViewCell class 的 swift 文件。我的问题是 UITableViewCell class 和 outlets。这个class有错误Class "HomeCell" has no initializers,我不明白这个问题
感谢您的回复。
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 可以在初始化阶段处理循环依赖(在本例中为 UI 组件的父 <-> 子)。
@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!
阅读这个 doc,他们解释得很好。
快速修复 - 确保所有在创建时未初始化的变量(例如 var num : Int?
与 var num = 5
)具有 ?
或 !
。
长答案(推荐)- 按照 mprivat 的建议阅读 doc...
这是来自 Apple doc
Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.
您收到错误消息 Class "HomeCell" has no initializers 因为您的变量处于不确定状态。要么创建初始值设定项,要么使它们成为可选类型,使用 !或者?
我的回答解决了一般错误,而不是 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
}
其他人提到 要么创建初始值设定项,要么将它们设为可选类型,使用 !或 ? 是正确的。然而,如果你有一个可选的member/property,那个可选的应该是可变的,即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
即我在没有展开的情况下声明了它,这就是我解决 (no initializer) 错误的方法:
var isActivityOpen: Bool!
只需为 HomeCell class
提供初始化块对我来说很管用