2014-09-08 4 views
3

내가 스위프트에 다음 코드를 가지고있는 개체 유형을 평가 :스위프트

func foo() 
    { 
     let name = "Hello World" 

     if name is String 
     { 

     } 
     else 
     { 

     } 
    } 


I get the error: 'is' test is always true 

나는 항상 진실을 알고! 그러나 이것이 왜 오류입니까?

+0

오류와 같은 경고를 처리하도록 Xcode를 구성 했습니까? –

+0

꺼져 있습니다. 아래 @vacawama 답변을 참조하십시오. –

답변

3

Swift가 쓸모없는 일을하는 것을 어렵게하기 때문에 오류입니다. 이 테스트가 항상 사실이기 때문에, 당신은 뭔가 다른 것을하려고 의도 했음에 틀림없는 빠른 수치.

스위프트는이 같은 형식 유추를 통해, 귀하의 선언을 컴파일
+0

나를 통제하고 컴퓨터에 무엇을 해야할지 말하고있는 것! :) –

4

: 당신은 그것을 그 때문에로 선언 된 유형에 대한 변수의 유형을 테스트 할 수 없습니다

let name: String = "Hello World" 
if name is String { ... 

항상 하고 있음을 true가됩니다 사실은 컴파일 타임에 분명합니다.이 경우 nameString입니다. Swift의 정적 유형 지정은이 테스트를 수행 할 필요가 없다는 것을 의미합니다. 변수 String은 항상 String이라고 가정 할 수 있습니다.

is을 사용하려면 var 유형을 비교할 유형과 일치시킬 수는 없지만 일치시킬 수 있어야합니다. 따라서이 은 이 String 일 수있는 모호한 유형이거나 다른 것일 수있는 경우 컴파일합니다.입니다. 그러면 테스트가 실제로 이치에 맞습니다.

let name: AnyObject = "Hello World" 
if name is String { 
    println("name is a string") 
} else { 
    println("name is NOT a string :(") 
} 

때 할 수 is 때 당신이 할 수없는 몇 가지 더 많은 예제.

// Good 
// AnyObject can be casted to String 
let name: AnyObject = "Hello World" 
if name is String {} 

// Also good 
// UInt32 can be casted to Int 
let num: UInt32 = 123 
if num is Int {} 

// error: 'String' is not a subtype of 'Int' 
// Int cannot be casted to String, this will NEVER be true 
let name: Int = 123 
if name is String {} 

// error: 'is' test is always true 
// String will always be string, this will ALWAYS be true 
let name: String = "Hello" 
if name is String {} 
1

신속한 변수는 매우 강하게 입력됩니다. 이런 식으로 쓰면, 코드에서 뭔가 잘못했을 가능성이 큽니다.

컴파일러가 오류로 출력한다는 점에 감사드립니다. 그렇지 않으면 else 브랜치가 어떤 조건 하에서 실행될 수도 있습니다.

데이터 유형 및 구조는 상속을 지원하지 않으므로 String 변수를 선언하면 다른 어떤 것도 될 수 없습니다 (프로토콜은 AnyAnyObject).

당신은 문자열 변수 선언하면 :

var test: String = "test" 

그것은 아무것도 할 수 없다, 그래서 이것은 항상 실패

if test is Int { // < 'Int' is not a subtype of 'String' 
    ... 
} 

테스트를 문자열이 문자열이 무의미 경우, 그래서 컴파일러 코드는 구문 적으로나 의미 상으로 정확하기 때문에 경고 일지라도 오류로 간주합니다.

덧붙여 AnyAnyObject에 대한 데이터 형식이나 구조체를 검사하면 같은 오류가 발생하므로 구현하는 모든 프로토콜에 대해 유효하다고 가정합니다.