[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"
}
답변
제 경우에는 다음 Bool
과 같이 선언했습니다 .
var isActivityOpen: Bool
즉, unwrapping하지 않고 선언 했으므로 다음과 같이 ( 초기화 없음 ) 오류를 해결했습니다 .
var isActivityOpen: Bool!
답변
귀하의 질문에 대한 구체적인 대답은 아니지만 속성으로 선언하는 동안 열거 형의 초기 값을 설정하지 않은 경우이 오류가 발생했습니다. 이 오류를 해결하기 위해 열거 형에 초기 값을 할당했습니다. 누군가에게 도움이 될 수 있으므로 여기에 게시하십시오.
답변
간단히 HomeCell 클래스에 init 블록을 제공하십시오
내 경우에는 효과가있다