2014-09-01 318 views
1

類型檢查,我不能這樣做,我認爲應該工作以下類型檢查:斯威夫特

var str:String? 

//Compiler error: Downcast from 'String?' to 'String' only unwraps optional; did you mean to use '!'? 
if str is String { 

} 

//Compiler error: is test is always true 
if str! is String { 
    println("str is optional string") 
} 
+0

我想說明使用is型檢查。 – Boon 2014-09-01 20:21:25

回答

6

"Type-Casting Operators"在斯威夫特文檔 (重點煤礦):

的是運算符會在運行時檢查該表達式是否可以向下轉換爲指定的類型 。如果表達式可以將 向下轉換爲指定的類型,則返回true;否則,它返回false。 如果轉換爲指定類型保證成功或失敗,則會引發編譯時錯誤。

String不是String?String適當的子類,因此is 操作者不能在此處使用。要檢查str是否有值,可以使用 可選分配:if let theString = str { ... }

工作的例子:

class A { } 
class B : A { } 

func foo(a : A) { 
    if a is B { 
     // a is an instance of the B subclass 
    } 
} 

func bar(obj: AnyObject) { 
    if obj is NSNull { 
     // The Null object 
    } 
} 

在許多情況下,有條件的投as?是因爲它返回更多有用的 指定類型的值:

func foo(a : A) { 
    if let b = a as? B { 
     // ... 
    } 
} 
+0

使用「is」檢查的關鍵是它是否可以降級。如果字符串不能轉換爲字符串?,那麼它應該返回false,否?否則,我們如何檢查類型? – Boon 2014-09-01 22:36:24

+0

@Boon:字符串不能被轉換爲字符串?將字符串投射到字符串?是*保證失敗*,因此編譯器錯誤(如上面引用的文檔中所述)。 - 對於'var str:AnyObject?',你可以測試'如果str是String ...'。 – 2014-09-02 07:49:14

0

strString?這是可選; 可選不能是String,因爲它是完全不同的類型。因此if str is String可以從來沒有是真實的,編譯器告訴你有關它。

str!同樣解開Sting?,其結果是總是String。因此if str! is String總是如此。

採用is示出爲具有:

class Shape {} 
class Rectangle : Shape {} 
class Circle : Shape {} 

func draw (s:Shape) { 
    if s is Rectangle {} 
    else if s is Circle {} 
    else {} 
} 

draw函數,編譯器識別出RectangleCircle是的參數Shape類型並且因此if語句允許亞型。