2015-12-02 104 views
2

我已經習慣了不斷崩潰的Swift編譯器,通常有很多可用的解決方法。 但是,這次我無法成功地使結構符合MutableCollectionType如何在不崩潰編譯器的情況下實現MutableCollectionType?

只要您不註銷MutableCollectionType一致性,就可以將所附示例粘貼到遊樂場中。
我避免了所有方法的具體實現來縮小崩潰的原因(因此所有的fatalError())。但即使方法正確實施,編譯器也會崩潰。

有沒有人有一個想法如何解決這個編譯器崩潰?

struct Test {} 


struct TestCollection: CollectionType { 

    typealias Index = Int 


    private var values: [Test] 


    var count: Int { 
     fatalError() 
    } 


    var endIndex: Int { 
     fatalError() 
    } 


    func generate() -> IndexingGenerator<Array<Test>> { 
     fatalError() 
    } 


    var isEmpty: Bool { 
     fatalError() 
    } 


    subscript(bounds: Range<Int>) -> ArraySlice<Test> { 
     fatalError() 
    } 


    subscript(position: Int) -> Test { 
     get { fatalError() } 
     mutating set { fatalError() } 
    } 


    var startIndex: Int { 
     fatalError() 
    } 
} 


// uncommenting the following line crashes the compiler 
// extension TestCollection: MutableCollectionType {} 
+0

比較的http://計算器.com/questions/32668635/swift-minimum-implementation-for-types-conforming-to-protocols-with-default-impl用於(可變)CollectionType的最小實現。 –

回答

2

是的,解決編譯器崩潰是非常困難的。雖然有一些有用的技術是有幫助的。首先,如果你編譯這個,並且它的段錯誤(現在這是爲我做的),你仍然可以進入Xcode的錯誤,它可能會給你更多的信息。

或者,您可以嘗試將您的崩潰降至最低工作示例,以查看哪個部分會使編譯器崩潰。碰巧,爲MutableCollectionType一致性方法的最小集合實際上是相當小:

struct Test {} 

struct TestCollection: MutableCollectionType { 

    var startIndex: Int { fatalError() } 

    var endIndex: Int { fatalError() } 

    subscript(position: Int) -> Test { 
    get { fatalError() } 
    mutating set { fatalError() } 
    } 

} 

所以現在我們可以添加回到你的多餘的東西,一個接一個,直到它崩潰。碰巧,typealias,count,generate()isEmpty,實際上更好被排除在外。該typealias推斷,countisEmpty可以基於計算的startIndexendIndex(並且如果你寫你自己的方法,將是一樣有效),以及generate()方法可以在集合本身返回IndexingGenerator,而不是陣列。

所以加回的唯一的事情是介於標:

extension TestCollection { 
    subscript(range: Range<Int>) -> ArraySlice<Test> { 
    fatalError() 
    } 
} 

望着那更貼切一點,你可能寫這個有點不同:

extension TestCollection { 
    subscript(range: Range<Int>) -> ArraySlice<Test> { 
    get { fatalError() } 
    set { fatalError() } 
    } 
} 

而且沒有錯誤!

只是一個小注:看起來像你周圍實施一個Array非常輕便的包裝,爲您Test結構。由於所涉及的正確遵循所需的所有協議的複雜性,你可能最好只延長Array提供你所需要的功能,或者類似這樣的擴展MutableCollectionType

extension MutableCollectionType where Generator.Element == Test {... 
+1

當然,編譯器不應該崩潰,但錯誤的原因似乎是'MutableCollectionType'需要*讀寫*'下標(範圍:範圍)'方法,並且OP定義了*只讀*方法。 –

+0

優秀的工作在這裏縮小事業!我沒有想到最低的實施是如此之小。從文檔和協議定義中推導出最小實現是非常困難的。 - 另外,查看文檔和定義,我現在可以看到提示'{get set}'爲破壞的下標。當編譯器不停地崩潰時,我不在那裏,我很驚訝這個信息丟失了。 - 你是對的,大多數實現將被映射到一個私有數組實例。但這很好,因爲我想隱藏結構的實現細節。 - 謝謝! – fluidsonic

+0

這是btw的結果:) https://github.com/fluidsonic/JetPack/blob/master/Sources/uncategorized/PhoneNumber.swift – fluidsonic

相關問題