2016-08-06 2 views
4

xCode에서이 코드를 시도했습니다 : let bigNum = Int8.max + Int("1")!bigNumInt8의 변수를 컴파일러에서 유추하여 오버플로 오류를 발생시킵니다. Int8.max + Int("1")! 들어타입 유추 뒤에있는 메커니즘에 대한 추측

: Int8"+" 갖는 타입의 왼쪽은 오른쪽 Int의 형태를 갖는다. 컴파일러가 bigNumInt으로 유추하지 않은 이유는 무엇입니까?

추측 : Int8가 더 작고 좁은 유형이 Int 비교하기 때문에 스위프트의 컴파일러는 항상 따라서 Int8으로 이어질 것 인 Int8Int 번호를 추가, 더 좁은/제한 값 형식으로 TYE을 추론 타입 유추.

질문 : 맞습니까? 또는 대부분 정확하지만 정확하게는 아닙니다. 그렇다면, 저를 시정하십시오.

감사합니다.

답변

7

형식 유추 엔진은 Ints의 비트 너비를 알지 못합니다. 그것은 인트가 숫자라는 것을 알지 못합니다. 엔진은 유형이 구현되는 방식의 "제한"또는 "좁음"에 대해 아무것도 모릅니다. 유형이 유형과 유형 ("ISA"relationships)으로서 서로 어떻게 관련되는지를 알고, 제공 한 유형 변수에 어떤 것이 연결될 수 있는지 파악하여 제한 조건 문제점을 해결하려고합니다.

대신 유형 유추 엔진이 선택되어있는 + 버전에서 선택됩니다. Int 기반의 + 함수 중 어느 것도 적용되지 않습니다. 그들은 양식의 모든 것 :

public func +(lhs: Int8, rhs: Int8) -> Int8 

을 그리고 이것은 양쪽에 Int8이 없습니다. 따라서 가장 구체적인 다음 항목을 선택합니다.

public func +<T : Strideable>(lhs: T, rhs: T.Stride) -> T 

왜이 제품입니까? Int8SignedInteger입니다. SignedInteger 구현 Strideable이 방법 : 타입 추론으로

public protocol Strideable : Comparable { 
    associatedtype Stride : SignedNumber 
    public func distance(to other: Self) -> Self.Stride 
    public func advanced(by n: Self.Stride) -> Self 
} 

extension SignedInteger { 
    public func distance(to other: Self) -> Int 
    public func advanced(by n: Int) -> Self 
} 

우리는 StrideInt 인 것을 알 수있다. 그래서 우리의 함수는 다음과 같습니다 :

public func +(lhs: Int8, rhs: Int) -> Int8 

물론 런타임에 오버플로가됩니다.

현재 Swift가 선택한 기능을 확인하는 가장 좋은 방법은 + 기호를 Option 키를 누른 상태로 클릭하는 것입니다. 사용중인 유형을 알려줍니다.

+0

"BTW, Swift가 선택한 기능을 알아내는 가장 좋은 방법은 + 기호를 Option- 클릭하는 것입니다."고맙습니다. – SLN

관련 문제