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


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

답변:


257

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

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

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


21
귀하의 설명과 그 문서는 모두 나에게 의미가 있지만 오류 메시지는 아닙니다!
coco

4
아마도 애플에게는 질문 일 것입니다
mprivat

또한 유지주기를 피하기 위해 @IBOutlets를 약한 것으로 표시해야합니다.
Dennis Pashkov

@Dennis Pashkov 내가 아는 한 viewController의 뷰 계층 구조에있는 IBOutlets에만 해당됩니다. 그렇지 않으면 아무도 잡지 않기 때문에 즉시 해제됩니다.
Alston

3
을 사용하여 Bool을 정의 한이 문제가있었습니다 var myBool: Bool.
jungledev

96

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

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


이 오류를 해결하려면?에 대한 기본값을 설정해야합니다. 변수, 예 : let showUserPointViewDelegate : ShowUserPointsViewControllerControl? = nil
Vladimir Vodolazkiy

+1 ?은 nil 일 수 있음을 의미하지만, 그렇다면 앞으로 나아가거나 아무것도하지 않는 데 아무런 문제가 없습니다. !unwrapping 후 그것이 0이 아니라면 충돌 이 시작 요구 사항을 만족 시킨다는 것을 컴파일러에게 알려줌으로써 : nil에서 시작한다는 것을 알고 있습니다.
Honey

컨트롤러 검색 var및 검색 let, 누락 된 !s 및 ?s
찾기

33

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

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

변수가 확정되지 않은 상태이므로 "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 ..

@drew .. 변경할 수없는 것을 설정하는 nil것은 매우 잘못되었습니다. 설정 var하는 것은 nil다른 일이다.

여보, 누가 불변의 물건에 말을 했습니까?
drew ..

10

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

var isActivityOpen: Bool 

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

var isActivityOpen: Bool!

1

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


0

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

내 경우에는 효과가있다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.