나는 사용하기 시작했 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
}
이 질문은 아마의 의견을 바탕으로,그래서 내 응답을 가진 곡물의 소금,하지만 나는'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
}
업데이트
사용 후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...
}
"힘의 캐스팅"그것의 장소가있을 때,당신알는 당신이 무엇'다시 캐스팅하는 유형에 대한 예입니다.
우리가 알고 있는마이뷰
에는 서브뷰는uilabel 의
태그가1
,우리는 가서 그 힘은 아래 캐스팅에서UIView
에서uilabel 의
안전
myLabel = myView.viewWithTag(1) as! UILabel
또한,더 안전한 옵션을 사용하는 것입니다.
guard let myLabel = myView.viewWithTag(1) as? UILabel else {
... //ABORT MISSION
}
후자는 안으로 그것을 명백하게 처리하는 어떤 나쁜 경우에만,이전이 더 쉽습니다. 그래서 정말 그것은 개인의 취향을 고려하지 뭔가가 될 수 있는 변경에 미래는 경우 또는'다시되지 않는 특정지 여부를 당신이 무엇을 풀어보는 것입니다 당신이 원하는 무엇을 캐스팅하려는 상황에서 그 경비는 항상 올바른 선택입니다.
요약하면 당신은 정확히 알고 있다는 것을 다할 수 있는 힘을 주지 않는 경우에도 조금 할 수있는 뭔가가 될 수 있는 다른 사용 가드
다른 사람에 대한 기록보다 일반적인 경우,그러나 나에게는 솔루션이 정확한 경우:
guard let cell = tableView.dequeueReusableCell(
withIdentifier: PropertyTableViewCell.reuseIdentifier,
for: indexPath) as? PropertyTableViewCell
else {
fatalError("DequeueReusableCell failed while casting")
}
기본적으로,주위를 감싸는가
문고 캐스팅 선택적으로는?
.
로 작업하는 경우에 당신의 유형이고 있는 그들은 형식과 항상 값이 있는,그것은 힘이 든다. 하는 경우드 당신은 쉽게 찾을 수 있습니다 당신은 실수는 부분의 UI 를 제거 셀,...
하지만 경우에 당신을 캐스팅 종류는 당신이't 알고있는 그것은 항상 같은 종류? 나는 항상 값? 당신이 피해야 힘을 풀
다음과 같 JSON 는 서버에서는't 확실 유형에는 또 하나의 열쇠를 가치가 있거나 없
죄송합니다 내 나쁜 영어를 개선하기 위해 노력하고 자신
좋은 운🤞🏻
는 경우에 당신은 정말로 확인해야 합 지정된 형식의 것인을 아래로 캐스팅. 그러나 내가 사용하여 다음과 같은 글로벌 기능에서 그러한 경우를 얻을 더 의미 있는 결과 로그에서는 내 눈에서 더 나은 방법:
public func castSafely<T>(_ 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()
}
}