2016-06-10 111 views
0

我有一個類似但略有不同的問題:Swift protocol extension method dispatch with superclass and subclassSwift協議擴展帶有超類和子類的靜態方法調度

該問題與協議上的靜態方法有關。

我有以下代碼:

protocol Protocol: class { 
    static var reuseID: String { get } 
} 

extension Protocol { 
    static var reuseID: String { return String(Self) } 
} 

class MyClass { 
    func registerClass<T where T: Protocol>(cell: T.Type) { 
     print(cell)   // <-- Prints "SubClass" 
     print(cell.self)  // <-- Prints "SubClass" 
     print(cell.reuseID) // <-- Prints "SuperClass", expected "SubClass" 
    } 
} 

class SuperClass: Protocol {} 
class SubClass: SuperClass {} 

print(SubClass.self) // <-- Prints "SubClass" 
print(SubClass.reuseID) // <-- Prints "SubClass" 
MyClass().registerClass(SubClass.self) 

行爲是「固定的」,如果我請從協議協議的reuseID聲明。這不是落後嗎?根據https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future用於調度對協議擴展的規則如下:

  1. IF推斷出的類型的變量的是協議:
  2. 並且該方法在原始協議THEN運行時類型的實現被稱爲定義,而不管在擴展中是否有默認實現。
  3. 並且該方法未在原始協議中定義,則調用默認實現。
  4. 否則如果變量的推斷類型是THEN類型的實現被調用。

我正在觀察的行爲恰恰相反。任何想法我做錯了什麼?

+0

據蘋果公司稱,它似乎是在斯威夫特的錯誤。我通過https://bugs.swift.org/browse/SR-1786在swift.org上提交了它 – duhanebel

回答

0

如何改變這樣的:

extension Protocol { 
    static var reuseID: String { return String(self) } 
} 
相關問題