2014-12-17 2 views
0

저는 Apple의 Swift 책을 읽고 있고 암시 적 변환에 대해 약간 혼란 스럽습니다. 그것이 말하는 직후 다음신속한 변환 규칙 이해

let mynum: Float = 4 

과 : 하나의 예에서 이있다. "값은 암시 적으로 다른 형식으로 변환되지 않습니다"

무슨 일이 벌어지고 있니? 그들은 단지 Int 리터럴을 암시 적으로 Float으로 변환 한 다음 값이 암시 적으로 변환되지 않는다고 말하고 있습니까? 아무도 규칙/예외가 여기에 무엇인지 설명 할 수 있습니까?

+0

표현식을 계산할 때 [ "CGFloat는 Int로 변환 할 수 없습니다"라는 가능한 복제본] (http://stackoverflow.com/questions/27461801/cgfloat-is-not-convertible-to-int-when-trying -to-calculate-an-expression) – matt

+0

@matt 다른 질문 –

+0

전혀 아니며 내 대답을 참조하십시오 : http://stackoverflow.com/a/27461821/341994 질문에 대답하지 않는다고 생각하면 생각해보십시오. 좀 더. – matt

답변

3

4은 "값"이 아닙니다. 그것은 문자 그대로입니다. 그러나 스위프트가 좋아하지만 해석 할 수 있습니다. "개종 할 것"이 없습니다. 그것은 값을 작성하는 데 사용되지만, 요청한 값이기 때문에 작성된 값은 Float가됩니다.

하지만 지금이 시도 :

let i : Int = 4 
let mynum: Float = i 

을 Ooooops.

그것을 다른 방법을 넣으려면 :

let mynum: Float = 4 

let mynum = Float(4) // we are _creating_ the value 

으로 해석되지만 우리는 i, 로 시작하는 경우 값을 만들 수 있습니다

let i : Int = 4 
let mynum: Float = Float(i) 

스위프트가 당신을 위해 그것을하지 않습니다.

보너스 LESSON 내 맥주를 잡고 를 볼 :

struct Dog : IntegerLiteralConvertible { 
    var number : Int? 
    init(integerLiteral: Int) { 
     self.number = integerLiteral 
    } 
} 
let dog : Dog = 42 

플로트 일종의, 그런 식으로 작동합니다.

+1

변수/상수 만 "값"으로 간주됩니까? 리터럴에 대한 규칙은 무엇입니까 (어딘가에 문서화되어 있습니까?) –

+0

Mmmmmm은 'IntegerLiteralConvertible' 프로토콜에 관한 것입니다. 나는 정말로 거기에 가고 싶다고 생각하지 않는다. – matt

+0

정말 호기심이 생기면, Swift 헤더를 보아라. 여기서 Float는 'IntegerLiteralConvertible'을 채택하도록 확장되었다. 즉, Float이 필요한 곳에 정수 리터럴을 제공 할 수 있으며, 이에 상응하는 특수한 'init'이 호출된다는 의미입니다. – matt