2015-06-14 61 views
0

我想確保在這兩種情況下我都能得到正確的語法,該類是超類或派生類?以下代碼的任何問題?向下轉換和可選:此代碼是否習慣?

ObjC:

if ([response isKindOfClass:[NSHTTPURLResponse class]] && [(NSHTTPURLResponse *)response statusCode] != 200) { 

夫特ObjC狀:

if response.isKindOfClass(NSHTTPURLResponse.self) && (response as! NSHTTPURLResponse).statusCode != 200 { 

更好夫特使用此語法(dataTaskURL)碼

class A { 

} 

class B : A { 
    var y = 42 
} 

// #1 

func test(x: A?) -> String { 
    return 
     (x as? B!)?.y == 42 ? "YES" : "NO" 
} 

let a: A? = A() 
print(test(a)) 

let b: B? = B() 
print(test(b)) 

實施例?

if (response as? NSHTTPURLResponse!)?.statusCode == 200 { 
+1

你爲什麼不測試它? –

+0

我做了:-),它的工作原理!我只是不確定這是否是「很好」和「安全」的正確方法。 – Laurent

回答

0

這是斯威夫特的方式(這是既安全又漂亮):

if (response as? NSHTTPURLResponse)?.statusCode == 200 { 

它採用條件鑄造可選鏈接這兩個測試類是NSHTTPURLResponse,而且statusCode200。請注意,NSHTTPURLResponse之後不需要!

如果response是另一個類,然後(response as? NSHTTPURLResponse)將返回nil,因而整個任選的鏈將返回nil並且由於nil != 200測試將失敗。

+0

謝謝。我接受了你的答案。任何想法爲什麼當我使用額外的'!'時編譯器甚至不會讓我感到溫暖? – Laurent

+0

我不確定這是錯的,但肯定是不必要的。有條件轉換的結果總是可選的。 – vacawama

相關問題