2017-08-05 39 views
1

我想我的斯威夫特3代碼轉換爲斯威夫特4.我收到此錯誤信息:類型的表達模式「字符串」不能匹配類型的值「NSStoryboardSegue.Identifier

表達模式」字符串「不能匹配類型的值」 NSStoryboardSegue.Identifier

這是我的代碼:

override func prepare(for segue: NSStoryboardSegue, sender: Any?) { 
    switch segue.identifier { 

     case "showVC1": 
      // DO SOMETHING 
      break 

     default: 
      break 
    } 
} 

我應該使用哪種類型,而不是‘字符串’?

回答

0

斯威夫特4 *identifier財產的類型從String?轉換爲NSStoryboardSegue.Identifier?。這種類型是RawRepresentableRawTypeString。您可能需要更改您的代碼的if陳述鏈,或使用rawValue明確:在測試

switch segue.identifier { 
    case let x where x.rawValue == "showVC1": 
     // DO SOMETHING 
    break 
    default: 
    break 
} 

*目前。

+0

@MartinR我還沒有訪問Swift 4,從規範回答。我刪除了提示'=='可能的部分答案。在一個不相干的筆記中,我真的很驚訝蘋果公司在這方面做了一個突破性的改變:我想不出將'標識符'從'String'改爲它自己的類型所帶來的好處。感謝您的評論! – dasblinkenlight

+1

對其他「標識符字符串」做了類似的修改,例如'NSImage(named:NSImage.Name)'。如果我沒有記錯的話,那是在Swift郵件列表中討論的(有爭議的)。我會盡量在稍後找到一些參考資料,列表檔案目前處於離線狀態。我感到奇怪的是,這種改變並沒有通過提案流程,至少我不記得這一點。 –

+0

我找到了參考資料,請參閱下面的更新答案。 –

6

作爲夫特4,故事板標識符是可選NSStoryboardSegue.Identifier,其被定義爲

extension NSStoryboardSegue { 
    public struct Identifier : RawRepresentable, Equatable, Hashable { 
     public init(_ rawValue: String) 
     public init(rawValue: String) 
    } 
} 

可以在其rawValue切換:

switch segue.identifier?.rawValue { 
    case "showVC1"?: 
     // do something ... 
    default: 
     break 
    } 

推薦圖案然而是定義每個 故事板標識符的常量:

extension NSStoryboardSegue.Identifier { 
    static let showVC1 = NSStoryboardSegue.Identifier("showVC1") 
    // other storyboard identifiers ... 
} 

其然後可以進行匹配:

switch segue.identifier { 
    case .showVC1?: 
     // do something ... 
    default: 
     break 
    } 

在這兩個例子中,「任選的圖案」 x?(對於.some(x)快捷方式) 被用於匹配一個可選值。

爲其他「標識符」引入了類似的類型,例如, NSImage.Name,這是NSImage(named:) 斯威夫特4

參數的類型有關更多信息,請參閱討論迅速用戶郵件 表,從

一般的想法(據我所知)是爲每種標識符創建單獨的類型 。特別是(從https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20170717/005940.html):

......我們故意不鼓勵名稱的字符串文字。字符串文字應該只在一個地方:名稱常量的定義。其他一切都應該使用常量。編譯器可以提供常量的自動完成和拼寫檢測。字符串文字沒有得到。