[英]Class has no initializers 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可以在初始化階段處理循環依賴(在這種情況下,UI組件的父< - >子)。
@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!
閱讀本文檔 ,他們很好地解釋了這一點。
快速修復 - 確保所有在創建時未初始化的變量(例如var num : Int?
vs var num = 5
)都有?
或者!
。
答案很長(推薦) - 按照mprivat的建議閱讀文檔 ......
這是來自Apple doc
在創建該類或結構的實例時,類和結構必須將其所有存儲的屬性設置為適當的初始值。 存儲的屬性不能保留在不確定的狀態。
您收到錯誤消息類“HomeCell”沒有初始值設定項,因為您的變量處於不確定狀態。 您可以創建初始化程序,也可以使用它們創建可選類型! 要么 ?
我的答案解決了一般的錯誤,而不是OP的確切代碼。 沒有回答提到這個說明所以我只是想添加它。
下面的代碼也會生成相同的錯誤:
class Actor {
let agent : String?
}
其他人提到你要么創建初始化器 , 要么使用它們制作可選類型! 要么 ? 哪個是對的。 但是,如果您有可選的成員/屬性,那個可選項應該是可變的,即var
。 如果你做了一個let
永遠無法擺脫它的nil
狀態。 那很糟!
所以正確的寫作方式是:
class Actor {
var agent : String? // it has a chance so its value can be set!
}
或者你可以把它寫成:
class Actor {
let agent : String?
init (agent: String?){
self.agent = agent // it has a chance so its value can be set!
}
}
或默認為任何值(包括有點愚蠢的nil
)
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
狀態。 那很糟!
所以正確的寫作方式是:
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!
}
或者你可以把它寫成:
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
)
class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal"
}
就我而言,我已經宣布了一個像這樣的Bool
:
var isActivityOpen: Bool
即我聲明它沒有展開,所以,這就是我解決( 無初始化 )錯誤的方法:
var isActivityOpen: Bool!
不是你問題的具體答案,但是當我在將enum聲明為屬性時沒有為枚舉設置初始值時,我遇到了這個錯誤。 我為枚舉分配了一個初始值來解決此錯誤。 在這里發布,因為它可能會幫助某人。
只需為HomeCell類提供init塊
這是我的工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.