은 힘을 주는 정말 나쁜 항상 피하는 것입니까?

나는 사용하기 시작했 swiftLint 하나의 모범 사례에 대한 신속을 피하기 위해 힘이 든다. 그러나 내가 그것을 사용하는 많은 처리할 때는 tableView,collectionView 셀:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellID, forIndexPath: indexPath) as! MyOffersViewCell

이것이 최상의 방법이 무엇's 권리를 처리하는 방법 이? 나는 경우에는 사용자와 같은?, 그러나 그 의미는 다른 조건이 나는 것이 필요로 돌아 빈 셀? 는 것을 허용합니까?

if let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellID, forIndexPath: indexPath) as? MyOffersViewCell {
      // code
} else {
      // code
}
질문에 대한 의견 (1)
해결책

이 질문은 아마의 의견을 바탕으로,그래서 내 응답을 가진 곡물의 소금,하지만 나는't 이 말하는 힘은 낙심은 항상**나,당신은 단지 고려해야 할 필요가 의미와 방법을 적용하는 특정 상황이다.

로! SomeClass이 계약체결,그것은 기본적으로 말한"I 을 보장하는 것이 인스턴스의 SomeClass". 는 경우에는 그것이라고 밝혀지't SomeClass 그 예외가 발생하기 때문에 당신이 침해의 계약입니다.

고려해야 하는 상황에 당신을 사용하는 이 계약과 무엇을 적절한 조치를 취할 수 있지 않은 경우에는't 힘을 사용하 downcast.

예제에서,당신은 줄 경우dequeueReusableCellWithIdentifier지 않't당신에게MyOffersViewCell당신은 아마 잘못 구성 할 수있는 뭔가로 셀 재사용 식별자와 예외를 찾는 데 도움이 됩는 문제입니다.

사용한 경우에는 조건 그때 낙심을 얻을 것이 전무가 처리는 어떻게든 로그 메시지가? 던지 예외가? 그것은 확실히 나타내는 복구할 수 없는 오류를 당신이 원하는 무언가를하는 동안 발견 개발을 것't 를 기대하는 이것을 처리한 후에 놓습니다. 코드 아't 가 갑자기 시작 돌아의 다른 유형 셀입니다. 만약 당신이 그냥 코드에 충돌 강제 풀이 죽은 것이 포인트 스트레이트 라인 곳에 문제가 발생했습니다.

지금 고려하는 경우 당신은에 액세스하는 일부 JSON 에서 검색된 웹 서비스입니다. 가 될 수 있는 변경에서는 웹 서비스입니다 당신의 통제를 벗어나도록 취급에 이상적으로 될 수도 있습니다. 귀하의 응용하지 않을 수 있습 기능을 할 수 있지만 적어도 당신을 보여줄 수 있는 경고 보다는 오히려 단순히 충:

나쁜 충돌을 경우 JSON 아't 배열

 let someArray=myJSON as! NSArray 
 ...

Better-핸들을 잘못된 JSON 경고

guard let someArray=myJSON as? NSArray else {
    // Display a UIAlertController telling the user to check for an updated app..
    return
}
해설 (1)

업데이트

사용 후Swiftlint동안,나는 지금은 총로 변환하 제로 강제 풀 컬트(에@Kevin's below).

수있는't 에는 어떤 상황을 강제로 적용해야 합니다-풀 선택할 수 있는't사용하는 경우게...,감시자...else,또는스위치...case 게...대신 합니다.

그래서 요즘 내가 이렇게:

for media in mediaArray {
    if let song = media as? Song {
        // use Song class's methods and properties on song...

    } else if let movie = media as? Movie {
        // use Movie class's methods and properties on movie...
    }
}

또는,당신이 선호하는 경우 우아함과 안전의 철저한switch문을 통해 버그 경향이 사슬의 경우 다른 사람의 다음:

switch media {
case let song as Song:
    // use Song class's methods and properties on song...
case let movie as Movie:    
    // use Movie class's methods and properties on movie...
default:
    // Deal with any other type as you see fit...
}

또는 더 나은,사용 flatMap()mediaArray두 가지로(비어 있을 수 있음)입력어레이 형식의[노래][동영상]각각합니다. 하지만 그의 범위 밖에서 질문(포스-푸)...

또한,나't 힘을 풀도 제거할 때는 테이블 보기세포. 는 경우 큐에서 제거되 셀 수 없습 캐스팅을 적절한UITableViewCell서브 클래스,즉 무언가가 잘못된 내 스토리 보드,그래서 그's 지 일부는 런타임 조건 내에서 복구할 수 있습니다(오히려 개발-시간에 오류가 감지되어야 하고 고쳐지는)그래서 나는 보석으로fatalError().


원본 대답(에 대한 기록)

이외에 Paulw11's,대답을 이 패턴은 완전히 유효하고,안전하고 때로는 유용:

if myObject is String {
   let myString = myObject as! String
}

예를 고려에 의해 주어진 사과:배열의미디어인스턴스에는 다음 중 하나를 포함할 수 있습니다노래또는영화를 개체(서브 클래스 미디어의):

let mediaArray = [Media]()

// (populate...)

for media in mediaArray {
   if media is Song {
       let song = media as! Song
       // use Song class's methods and properties on song...
   }
   else if media is Movie {
       let movie = media as! Movie
       // use Movie class's methods and properties on movie...
   }
해설 (2)

"힘의 캐스팅"그것의 장소가있을 때,당신는 당신이 무엇'다시 캐스팅하는 유형에 대한 예입니다.

우리가 알고 있는마이뷰에는 서브뷰는uilabel 의태그가1,우리는 가서 그 힘은 아래 캐스팅에서UIView에서uilabel 의안전

myLabel = myView.viewWithTag(1) as! UILabel

또한,더 안전한 옵션을 사용하는 것입니다.

guard let myLabel = myView.viewWithTag(1) as? UILabel else {
  ... //ABORT MISSION
}

후자는 안으로 그것을 명백하게 처리하는 어떤 나쁜 경우에만,이전이 더 쉽습니다. 그래서 정말 그것은 개인의 취향을 고려하지 뭔가가 될 수 있는 변경에 미래는 경우 또는'다시되지 않는 특정지 여부를 당신이 무엇을 풀어보는 것입니다 당신이 원하는 무엇을 캐스팅하려는 상황에서 그 경비는 항상 올바른 선택입니다.

요약하면 당신은 정확히 알고 있다는 것을 다할 수 있는 힘을 주지 않는 경우에도 조금 할 수있는 뭔가가 될 수 있는 다른 사용 가드

해설 (0)

다른 사람에 대한 기록보다 일반적인 경우,그러나 나에게는 솔루션이 정확한 경우:

guard let cell = tableView.dequeueReusableCell(
    withIdentifier: PropertyTableViewCell.reuseIdentifier,
    for: indexPath) as? PropertyTableViewCell
else {
    fatalError("DequeueReusableCell failed while casting")
}

기본적으로,주위를 감싸는문고 캐스팅 선택적으로는?.

해설 (2)

로 작업하는 경우에 당신의 유형이고 있는 그들은 형식과 항상 값이 있는,그것은 힘이 든다. 하는 경우드 당신은 쉽게 찾을 수 있습니다 당신은 실수는 부분의 UI 를 제거 셀,...

하지만 경우에 당신을 캐스팅 종류는 당신이't 알고있는 그것은 항상 같은 종류? 나는 항상 값? 당신이 피해야 힘을 풀

다음과 같 JSON 는 서버에서는't 확실 유형에는 또 하나의 열쇠를 가치가 있거나 없

죄송합니다 내 나쁜 영어를 개선하기 위해 노력하고 자신

좋은 운🤞🏻

해설 (0)

는 경우에 당신은 정말로 확인해야 합 지정된 형식의 것인을 아래로 캐스팅. 그러나 내가 사용하여 다음과 같은 글로벌 기능에서 그러한 경우를 얻을 더 의미 있는 결과 로그에서는 내 눈에서 더 나은 방법:

public func castSafely(_ object: Any, expectedType: T.Type) -> T {
    guard let typedObject = object as? T else {
        fatalError("Expected object: \(object) to be of type: \(expectedType)")
    }
    return typedObject
}

를 들어 사용:

class AnalysisViewController: UIViewController {

    var analysisView: AnalysisView {
        return castSafely(self.view, expectedType: AnalysisView.self)
    }

    override func loadView() {
        view = AnalysisView()
    }
}
해설 (3)