2017-09-29 5 views
2

의 값과 일치 할 수 없습니다. 새 작업을 신속하게 배우고 정적 테이블보기에서 작업하는 중이며 튜플을 사용하여 어떤 셀을 추적할지 결정했습니다. 가 선택되었습니다. 정말 혼란 무엇 다음과 같은 간단한 코드스위프트 튜플 스위치 케이스 : 유형의 패턴이

let ABOUTPROTECTIONCELL = (section: 1, row: 0) 
    let cellIdentifier = (section: indexPath.section, row: indexPath.row) 

    switch cellIdentifier { 
    case ABOUTPROTECTIONCELL: 
     print("here") 
    default: 
     print("bleh") 
    } 

의 결과는

Expression pattern of type '(section: Int, row: Int)' cannot match values of type '(section: Int, row: Int)'

이 오류 내가 사용할 때 문 대신 "경우"다음과 같은 것이 있습니다 : 그러나 나는 다음과 같은 오류를 받고 있어요 나는 if 문보다는이 더 우아한 발견하면 스위치 문 모든

if (cellIdentifier == CELL_ONE) { 
     print("cell1") 
    } else if (cellIdentifier == CELL_TWO) { 
     print("cell2") 
    } else if (cellIdentifier == CELL_THREE) { 
     print("cell3") 
    } 

은 스위치 문이 할 수있는 방법이 있나요 ... 프로그램이 잘 실행 잘 작동? 왜 이것이 효과가 없는지에 대해 매우 궁금합니다. 미리 감사드립니다!

+1

튜플'Equatable'하지 않기 때문에 귀하의 코드는 컴파일되지 않습니다. See [tuple 상수를 switch 문에서 대/소문자로 사용할 수없는 이유] (https://stackoverflow.com/questions/29677991/why-cant-i-use-a-tuple-constant-as-a- case-in-a-switch-statement). –

+0

그들이 같지 않으면 if 문이 컴파일되고 실행되는 이유는 무엇입니까? 그것이 나를 혼란스럽게 만든다. –

+0

튜플에 대해 '=='연산자가 있지만 튜플이 프로토콜을 따르지 않습니다. - 또한 : Equatable 프로토콜은'== operator'의 존재를 보장하지만'=='연산자는 Equatable에 대한 적합성을 의미하지 않습니다 –

답변

2

용액 1

let ABOUTTROVPROTECTIONCELL = (section: 1, row: 0) 
let cellIdentifier = (section: indexPath.section, row: indexPath.row) 

switch cellIdentifier { 
case (ABOUTTROVPROTECTIONCELL.section, ABOUTTROVPROTECTIONCELL.row): 
    print("here") 
default: 
    print("bleh") 
} 

해결책 2

다만 만드는 IndexPath 구조체 및 초기화를 사용 ABOUTTROVPROTECTIONCELL

let ABOUTTROVPROTECTIONCELL = IndexPath(row: 0, section: 1) 
let cellIdentifier = indexPath // Not necessary, you can just use indexPath instead 

switch cellIdentifier { 
case ABOUTTROVPROTECTIONCELL: 
    print("here") 
default: 
    print("bleh") 
} 

해결책 3

당신의 튜플에 대한 ~= FUNC를 구현 :

typealias IndexPathTuple = (section: Int, row: Int) 
func ~=(a: IndexPathTuple, b: IndexPathTuple) -> Bool { 
    return a.section ~= b.section && a.row ~= b.row 
} 

let ABOUTTROVPROTECTIONCELL = (section: 1, row: 0) 
let cellIdentifier = (section: indexPath.section, row: indexPath.row) 

switch cellIdentifier { 
case ABOUTTROVPROTECTIONCELL: 
    print("here") 
default: 
    print("bleh") 
} 
+0

첫 번째 경우는'switch cellIdentifier { case (ABOUTTROVPROTECTIONCELL.section) , ABOUTTROVPROTECTIONCELL.row) : ' –

+0

@MidhunMP, 예, 감사합니다. –