내가 스위프트에 다음 코드를 가지고있는 개체 유형을 평가 :스위프트
func foo()
{
let name = "Hello World"
if name is String
{
}
else
{
}
}
I get the error: 'is' test is always true
나는 항상 진실을 알고! 그러나 이것이 왜 오류입니까?
내가 스위프트에 다음 코드를 가지고있는 개체 유형을 평가 :스위프트
func foo()
{
let name = "Hello World"
if name is String
{
}
else
{
}
}
I get the error: 'is' test is always true
나는 항상 진실을 알고! 그러나 이것이 왜 오류입니까?
Swift가 쓸모없는 일을하는 것을 어렵게하기 때문에 오류입니다. 이 테스트가 항상 사실이기 때문에, 당신은 뭔가 다른 것을하려고 의도 했음에 틀림없는 빠른 수치.
스위프트는이 같은 형식 유추를 통해, 귀하의 선언을 컴파일나를 통제하고 컴퓨터에 무엇을 해야할지 말하고있는 것! :) –
: 당신은 그것을 그 때문에로 선언 된 유형에 대한 변수의 유형을 테스트 할 수 없습니다
let name: String = "Hello World"
if name is String { ...
항상
하고 있음을 true가됩니다 사실은 컴파일 타임에 분명합니다.이 경우
name
은
String
입니다. 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 {}
신속한 변수는 매우 강하게 입력됩니다. 이런 식으로 쓰면, 코드에서 뭔가 잘못했을 가능성이 큽니다.
컴파일러가 오류로 출력한다는 점에 감사드립니다. 그렇지 않으면 else 브랜치가 어떤 조건 하에서 실행될 수도 있습니다.
데이터 유형 및 구조는 상속을 지원하지 않으므로 String
변수를 선언하면 다른 어떤 것도 될 수 없습니다 (프로토콜은 Any
및 AnyObject
).
당신은 문자열 변수 선언하면 :
var test: String = "test"
그것은 아무것도 할 수 없다, 그래서 이것은 항상 실패
if test is Int { // < 'Int' is not a subtype of 'String'
...
}
테스트를 문자열이 문자열이 무의미 경우, 그래서 컴파일러 코드는 구문 적으로나 의미 상으로 정확하기 때문에 경고 일지라도 오류로 간주합니다.
덧붙여 Any
및 AnyObject
에 대한 데이터 형식이나 구조체를 검사하면 같은 오류가 발생하므로 구현하는 모든 프로토콜에 대해 유효하다고 가정합니다.
오류와 같은 경고를 처리하도록 Xcode를 구성 했습니까? –
꺼져 있습니다. 아래 @vacawama 답변을 참조하십시오. –