[ios] 클래스에 이니셜 라이저가 없습니다.

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)
    }

}



답변

초기화 단계에서 Swift가 순환 종속성 (이 경우 UI 구성 요소의 부모 <-> 자식)에 대처할 수 있도록 암시 적으로 래핑되지 않은 옵션을 사용해야합니다.

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

문서를 읽고 , 모두 잘 설명합니다.


답변

빠른 수정-생성 될 때 초기화되지 않은 모든 변수 (예 : var num : Int?vs var num = 5)에 a ?또는 a가 있는지 확인하십시오 !.

긴 답변 (권장) -mprivat이 제안한대로 문서 를 읽으십시오 …


답변

이것은 Apple Doc 에서 온 것입니다

클래스와 구조체는 해당 클래스 나 구조체의 인스턴스가 만들어 질 때까지 저장된 모든 속성을 적절한 초기 값으로 설정해야합니다. 저장된 특성은 불확실한 상태로 둘 수 없습니다.

변수가 확정되지 않은 상태이므로 “HomeCell”클래스에 이니셜 라이저가 없다는 오류 메시지가 표시 됩니다. !를 사용하여 이니셜 라이저를 작성하거나 옵션 유형을 선택하십시오. 또는?


답변

내 대답은 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 를 읽으 십시오 .


답변

제 경우에는 다음 Bool과 같이 선언했습니다 .

var isActivityOpen: Bool 

즉, unwrapping하지 않고 선언 했으므로 다음과 같이 ( 초기화 없음 ) 오류를 해결했습니다 .

var isActivityOpen: Bool!


답변

귀하의 질문에 대한 구체적인 대답은 아니지만 속성으로 선언하는 동안 열거 형의 초기 값을 설정하지 않은 경우이 오류가 발생했습니다. 이 오류를 해결하기 위해 열거 형에 초기 값을 할당했습니다. 누군가에게 도움이 될 수 있으므로 여기에 게시하십시오.


답변

간단히 HomeCell 클래스에 init 블록을 제공하십시오

내 경우에는 효과가있다