クラスに初期化子Swiftがありません


181

Swiftクラスに問題があります。UITableViewControllerクラスとUITableViewCellクラスの迅速なファイルがあります。私の問題は、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)
    }

}

nib変数のタイプをオプションのUINibとして明示的に記述する必要がありますか?
Cocoadelica、2015年

回答:


257

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

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

このドキュメントを読んで、彼らはそれをすべてうまく説明しています。


21
あなたの説明とそのドキュメントはすべて私には意味がありますが、エラーメッセージではありません!
coco

4
それはおそらくAppleへの質問でしょう
mprivat '28

また、保持サイクルを回避するために、@ IBOutletsを弱いものとしてマークする必要があります。
Dennis Pashkov

@Dennis Pashkov私が知る限り、viewControllerのビュー階層にあるのはIBOutletsのみです。それ以外の場合は、誰も保持していないため、すぐに解放されます。
Alston、2016年

3
を使用してBoolを定義したところ、この問題が発生しましたvar myBool: Bool
jungledev 2016年

96

クイックフィックス-作成時に初期化されないすべての変数(var num : Int?vsなどvar num = 5)にa ?またはがあることを確認します!

長い回答(推奨)-mprivatの提案に従ってドキュメントを読んでください...


このエラーを解決するには、?のデフォルト値を設定する必要があります。変数、たとえば:showUserPointViewDelegate:ShowUserPointsViewControllerControl?= nil
Vladimir Vodolazkiy 2016年

+1 ?は、nilの可能性があることを意味しますが、nullの場合は、前進して何もしないことに問題はありません。!ラップ解除後にnilだった場合、コンパイラーに通知することでクラッシュ(どちらも開始要件を満たす)が発生した場合は、コンパイラーに通知します。
Honey

検索varletあなたのコントローラ、および不足しているため見た目閲覧!Sと?Sを
Wiingaard

33

これはアップルのドキュメントからです

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

変数が不確定な状態にあるため、エラーメッセージ「クラス "HomeCell"には初期化子がありません」が表示されます。イニシャライザを作成するか、!または?


32

私の答えは、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。それは良くないね!

したがって、正しい記述方法は次のとおりです。

オプション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こちらこちらをお読みください


2
画像の重要な部分でしたので、これを追加していただきありがとうございます。
Jim

よく説明されました!!
Mahendra

1
nilに設定するのは馬鹿ではありませんが、いくつのモデルが機能するかには固有のものです。
ました。

@drew ..不変なものを設定することnilは非常に間違っています。に設定するvarことnilは別のものです。
ハニー

ねえハニー、誰が不変のオブジェクトと話していましたか?
..

10

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

var isActivityOpen: Bool 

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

var isActivityOpen: Bool!

1

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


0

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

それは私の場合にはうまくいきます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.