类没有初始化程序Swift

Kev*_* Py 177 uitableview ios 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

mpr*_*vat 254

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

@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!
Run Code Online (Sandbox Code Playgroud)

阅读本文档,他们很好地解释了这一点.

  • 你的解释和那个文档都对我有意义,但不是错误信息! (21认同)
  • 这对苹果来说可能是一个问题 (4认同)
  • 我有这个问题,我使用`var myBool:Bool`定义了一个Bool. (3认同)

Byr*_*see 94

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

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


Cod*_*elp 33

这是来自Apple doc

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

您收到错误消息类"HomeCell"没有初始值设定项,因为您的变量处于不确定状态.您可以创建初始化程序,也可以使用它们创建可选类型!要么 ?


Hon*_*ney 29

简单回答:

我的答案解决了一般的错误,而不是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
}
Run Code Online (Sandbox Code Playgroud)

其他人提到你要么创建初始化器,要么使用它们制作可选类型!要么 ?哪个是对的.但是,如果你有一个可选的成员/属性,那个可选的应该是可变的,即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!
}
Run Code Online (Sandbox Code Playgroud)

或者你可以把它写成:

选项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!
    }
}
Run Code Online (Sandbox Code Playgroud)

或默认为任何值(包括nil哪种有点愚蠢)

2选项:

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}
Run Code Online (Sandbox Code Playgroud)

深刻回答:

我的答案解决了一般的错误,而不是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
}
Run Code Online (Sandbox Code Playgroud)

其他人提到你要么创建初始化器,要么使用它们制作可选类型!要么 ?哪个是对的.但是,如果你有一个可选的成员/属性,那个可选的应该是可变的,即let.如果你做了一个var那么它就永远无法摆脱它的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!
}
Run Code Online (Sandbox Code Playgroud)

或者你可以把它写成:

选项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!
    }
}
Run Code Online (Sandbox Code Playgroud)

或默认为任何值(包括var哪种有点愚蠢)

2选项

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}
Run Code Online (Sandbox Code Playgroud)

如果你很好奇为什么let(相反nil)没有初始化,nil那么请在这里这里阅读

  • 感谢您添加此内容,因为它是图片的关键部分. (2认同)
  • 设置为 nil 并不愚蠢,而是多少模型工作所固有的。 (2认同)

Anu*_*rma 10

在我的情况下,我宣布了Bool这样的:

var isActivityOpen: Bool 
Run Code Online (Sandbox Code Playgroud)

即我声明它没有展开,所以,这就是我解决(无初始化)错误的方法:

var isActivityOpen: Bool!
Run Code Online (Sandbox Code Playgroud)