2017-02-02 1 views
2

다음 코드는 엑스 코드 8.2.1 나에게 오류를주고있다 :'INT1은'초기화에서 삼항 연산자와 'BOOL'오류로 변환되지 않습니다

UIColor(red: redSwitch.isOn ? 1 : 0, green: greenSwitch.isOn ? 1 : 0, blue: blueSwitch.isOn ? 1 : 0) 

오류 :

'Int1'은 'Bool'로 변환 할 수 없습니다.

왜 그런가요? redSwitch.isOnif 문 조건에서 올바르게 작동합니다. Apple 참조 documentation says UISwitch.isOn returns Bool.

어떻게 작동합니까?

+0

또한 괄호를 추가하는 것을 고려해보십시오. 그들은 차이를 만들 수도 있고 만들지 않을 수도 있지만 가독성을 높입니다. – dfd

+0

@Hamish, 고쳐주었습니다! 매개 변수 누락에 대한 이상한 오류 메시지 ... 답글로 의견을 게시해야 신용을 부여 할 수 있습니다. –

답변

3

이 메시지는 쓰레기 오류 메시지이지만 UIColorinit(red:green:blue:alpha:) 이니셜 라이저의 alpha: 매개 변수가 누락되었다는 것이 문제입니다. 내가 무엇을 말할 수에서

let color = UIColor(red: redSwitch.isOn ? 1 : 0, green: greenSwitch.isOn ? 1 : 0, 
        blue: blueSwitch.isOn ? 1 : 0, alpha: 1) 

는 이상한 오류 메시지의 소스는 매개 변수 중 하나를 놓치고 convenience initialiser 통화에서 삼항 연산자를 사용하는 것 같다.

더 최소한의 예는 다음과 같습니다

내가 나서서이 오류, SR-3839를 통해 버그를 제출
class Foo { 
    convenience init(a: Int, b: Int) {} 
} 

let f = Foo(a: true ? 1 : 0) // 'Int1' is not convertible to 'Bool' 

.

0

다른 버그가 있습니다.

import CoreGraphics 
let hit: Bool = true 
let returnStroke: Bool = false 
let rotation: CGFloat = (hit ? 90 : 120) 
rotation *= returnStroke ? -1.0 : 1.0 // 'Int1' is not convertible to 'Bool' 

진짜 문제는 rotation 변수 아닌 일정해야한다는 것이다. let에서 var으로 변경하면 "convertible"오류가 사라지고 코드가 실행됩니다.

rotation을 상수로 유지하면서 오른쪽 식에 괄호를 사용하지 않으면 올바른 오류 메시지가 나타납니다. 그 메시지는 "돌연변이 연산자의 왼쪽 편은 변경할 수 없습니다 ..."

관련 문제