web-dev-qa-db-ja.com

クラスに初期化子がありません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)
    }

}
170
Kevin Py

Swiftが初期化段階で循環依存関係(この場合はUIコンポーネントの親<->子)に対応できるように、暗黙的にラップされていないオプションを使用する必要があります。

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

これを読んでください doc 、彼らはそれをすべてうまく説明しています。

247
mprivat

クイックフィックス - 作成時に初期化されないすべての変数(例えばvar num : Int? vs var num = 5)が?!のどちらかであることを確認してください。

長い回答(推奨) - mprivatが示唆しているように ドキュメント を読む...

90
Byron Coetsee

これはアップルからです doc

クラスと構造体は、そのクラスまたは構造体のインスタンスが作成されるまでに、格納されているすべてのプロパティを適切な初期値に設定する必要があります。保存されたプロパティは不確定な状態のままにすることはできません。

エラーメッセージが表示されます。クラス "HomeCell"には初期化子がありません。変数が未確定状態にあるためです。初期化子を作成するか、あるいはそれらをオプション型にするかのどちらかを使用します。それとも?

32
CodeHelp

簡単な答え:

私の答えは、一般的なエラーであり、OPの正確なコードではありません。このノートには答えがありませんでしたので、追加したと思いました。

以下のコードでも同じエラーが発生します。

class Actor {
    let agent : String?
}

他の人たちはと言っていますあなたが初期化子を作成するか、あなたはそれらをオプションの型にします。または?が正しいです。ただし、オプションのメンバ/プロパティがある場合は、そのオプションは可変にする必要があります。つまり、varです。 letを作ると、nevernil状態から抜け出すことができなくなります。それは良くないね!

正しい記述方法は次のとおりです。

オプション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を含む)

オプション3:

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を作ると、nevernil状態から抜け出すことができなくなります。それは良くないね!

正しい記述方法は次のとおりです。

オプション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に初期化されないのか知りたいのであれば、 ここ

25
Honey

私の場合、私はこのようにBoolを宣言しました:

var isActivityOpen: Bool 

つまり、アンラップせずに宣言しました。これで、(noイニシャライザ)エラーが解決されました。

var isActivityOpen: Bool!
8
Anurag Sharma

あなたの質問に対する具体的な答えではありませんが、プロパティとして宣言しているときにenumの初期値を設定していなかったときにこのエラーが発生しました。このエラーを解決するためにenumに初期値を割り当てました。それが誰かに役立つかもしれないのでここに投稿してください。

1
Sonu VR

HomeCellクラスのinitブロックを提供するだけです。

私の場合はうまくいきました

0
anoopbryan2