내가 가진 문제를 보여주기 위해 테스트 코드 를 만들었습니다 .
이것은 놀이터에서 잘 컴파일되지만 프로젝트에 넣으려고 할 때 Xcode는 다음 경고를 표시합니다. Treating a forced downcast to 'String' as optional will never produce 'nil'
on line 30 . 문제를 해결하기위한 두 가지 제안이 있습니다.
Use 'as?' to perform a conditional downcast to 'String'
, 그것은 절대적으로 의미가 없습니다. 그러나 경고 / 오류없이 컴파일됩니다. 이는 선택적 값이 아닌 유형의 String
.
다운 캐스트가 성공할지 확실하지 않은 경우 유형 캐스트 연산자 (as?)의 조건부 형식을 사용하십시오. 이 형식의 연산자는 항상 선택적 값을 반환하며, 다운 캐스트가 불가능한 경우 값은 nil이됩니다. 이를 통해 성공적인 다운 캐스트를 확인할 수 있습니다.
로부터 스위프트 언어 가이드 .
nil
변환이 실패하면 할당하고 싶다고 생각하지 않는 한 (사전 항목을 제거하기 때문에) 이것은 의미가 없습니다. 특히 나는 그것이 문자 그대로 확인했기 때문에 성공할 것이라고 확신하기 때문에 String
.
Add parentheses around the cast to silence this warning
, 이는 무의미한 것 같지만 않는 경고를 침묵. 이것은 이상한 일처럼 보이지만 다시 말하지만, 당신이하려는 일을 정말로하고 싶다는 것을 확인하는 것은 좋지 않은 방법 일 수 있습니다.
어떤 옵션이 옳거나 둘 다 옳지 않습니까? 이 경고의 원인은 무엇입니까?
올바른 해결책은 강제 풀기 연산자 대신 선택적 바인딩을 사용하는 것입니다 !
. 실제로 수표 value != nil
를 switch
진술에 통합 할 수 있습니다 .
for (key, value) in dict {
switch value {
case let s as String:
newDict[key] = s
case let i as Int:
newDict[key] = String(i)
case let b as Bool:
newDict[key] = b ? "1" : "0"
case let v?: // value is not `nil`
newDict[key] = String(v)
default: // value is `nil`
break
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다