조건부 바인딩 : 오류가 발생한 경우 – 조건부 바인딩의 이니셜 라이저에는 선택적 유형이 있어야합니다.


120

내 데이터 소스와 다음 코드 줄에서 행을 삭제하려고합니다.

if let tv = tableView {

다음 오류가 발생합니다.

조건부 바인딩의 이니셜 라이저에는 UITableView가 아닌 ​​선택적 유형이 있어야합니다.

다음은 전체 코드입니다.

// Override to support editing the table view.
func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        // Delete the row from the data source

    if let tv = tableView {

            myData.removeAtIndex(indexPath.row)

            tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

다음을 어떻게 수정해야합니까?

 if let tv = tableView {

8
이후 tableView옵션 값이 아니라,이 전무인지 여부를 확인 할 필요가 없습니다. 직접, I 평균 제거하는 것이 사용할 수 있도록 if let 그냥 사용 tableView하는 기능에
에릭 키안

후손을 위해이 문제를 해결 한 후를 만났습니다.이 문제 variable with getter/setter cannot have an initial value는 초기화 후 남은 {} 블록을 제거하여 해결되었습니다. ala이 답변 : stackoverflow.com/a/36002958/4544328
Jake T.

답변:


216

if let/ if var선택적 바인딩은 표현식의 오른쪽 결과가 선택적 일 때만 작동합니다. 오른쪽 결과가 선택 사항이 아닌 경우이 선택적 바인딩을 사용할 수 없습니다. 이 선택적 바인딩의 요점은 nil변수가 아닌 경우에만 확인 하고 사용하는 것 nil입니다.

귀하의 경우 tableView매개 변수는 선택 사항이 아닌 유형으로 선언됩니다 UITableView. 절대로 보장되지 않습니다 nil. 따라서 여기에 선택적 바인딩이 필요하지 않습니다.

func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        myData.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

우리가해야 할 일은를 제거하고 그 안에서 if let발생하는 모든 tv것을 tableView.



16

ArticleCell과 같은 사용자 정의 셀 유형을 사용하는 경우 다음과 같은 오류가 발생할 수 있습니다.

    Initializer for conditional binding must have Optional type, not 'ArticleCell'

코드 줄이 다음과 같으면이 오류가 발생합니다.

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

다음을 수행하여이 오류를 수정할 수 있습니다.

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell?

위를 확인하면 후자가 ArticleCell 유형의 셀에 대해 선택적 캐스팅을 사용하고 있음을 알 수 있습니다.


제 경우에는as! ArticleCell?
lilbiscuit

9

가드 문 에도 동일하게 적용됩니다 . 동일한 오류 메시지가 나를이 게시물로 이끌고 답변합니다 (@nhgrif에게 감사드립니다).

코드 : 중간 이름이 4 자 미만인 경우에만 그 사람의 성을 인쇄하십시오.

func greetByMiddleName(name: (first: String, middle: String?, last: String?)) {
    guard let Name = name.last where name.middle?.characters.count < 4 else {
        print("Hi there)")
        return
    }
    print("Hey \(Name)!")
}

마지막 으로 선택적 매개 변수로 선언 할 때까지 동일한 오류가 표시되었습니다.


4

조건 바인딩에는 옵션 유형이 있어야합니다. 즉, if let 문에서 선택적 값만 바인딩 할 수 있습니다.

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // Delete the row from the data source

        if let tv = tableView as UITableView? {


        }
    }
}

이것은 잘 작동하지만 옵티 널 유형 "?"이 있어야하는 경우 사용할 때 확인하십시오.


0

글쎄요, if의 조건 안에서 일반적인 값을 선언 할 수 있다면 (구문 적으로) 여전히 편리 할 것입니다. 그래서 여기에 트릭이 있습니다. 컴파일러가 Optional.some(T)다음과 같은 값에 할당이 있다고 생각하게 만들 수 있습니다 .

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.