2016-10-17 3 views
3

У меня возникли проблемы с поиском документации о том, как соответствовать MutableCollection. Google полностью пуст по этой теме.Как соответствовать MutableCollection?

Пример, я хочу, чтобы добавить соответствие для GMSPath/GMSMutablePath:

import CoreLocation 
import GoogleMaps 

extension GMSPath: RandomAccessCollection { 

    public var startIndex: Int { 
     return 0 
    } 

    public var endIndex: Int { 
     return count 
    } 

    public func index(before i: Int) -> Int { 
     return i-1 
    } 

    public func index(after i: Int) -> Int { 
     return i+1 
    } 

    public subscript(position: Int) -> CLLocationCoordinate2D { 
     return coordinate(at: UInt(position)) 
    } 
} 

extension GMSMutablePath: MutableCollection { // Error! 

    public override subscript(position: Int) -> CLLocationCoordinate2D { 
     get { 
      return coordinate(at: UInt(position)) 
     } 
     set { 
      replaceCoordinate(at: UInt(position), with: newValue) 
     } 
    } 
} 

Error: Type 'GMSMutablePath' does not conform to a) 'MutableIndexable', b) 'MutableCollection'.

Документация для MutableCollection состояний:

To add conformance to the MutableCollection protocol to your own custom collection, upgrade your type’s subscript to support both read and write access.

Я сделал это.

MutableCollection наследует от MutableIndexable, Документов с указанием:

In most cases, it’s best to ignore this protocol and use the MutableCollection protocol instead, because it has a more complete interface.

Hm?

+0

Поскольку MutableCollection является подтипом MutableIndexable, вы должны соответствовать MutableIndexable для присвоения MutableCollection – Alexander

+0

Любые подсказки, что точно реализовать? С реализацией по умолчанию и т. Д. Вы никогда не знаете, что вам нужно реализовать. И документы не совсем понятны. – tombardey

+0

Реализации по умолчанию, перечисленные в документе, вам нужно порицать хотя бы все, кроме тех, – Alexander

ответ

1

Проблема здесь была в том, что я также соответствовал RandomAccessCollection, а не только Collection/MutableCollection. В этом случае, вопреки тому, что обещают обещания, мы должны сделать больше, чем просто предоставить установщик индексов. В частности, индексы срезов должны быть реализованы.

В итоге я получил следующее. Типизации необходимы, потому что компилятор не всегда может их выводить.

extension GMSPath: RandomAccessCollection { 

    public typealias Index = Int 
    public typealias Indices = DefaultRandomAccessIndices<GMSPath> 

    public var startIndex: Index { 
     return 0 
    } 

    public var endIndex: Index { 
     return count 
    } 

    public func index(before i: Index) -> Index { 
     return i-1 
    } 

    public func index(after i: Index) -> Index { 
     return i+1 
    } 

    public subscript(position: Index) -> CLLocationCoordinate2D { 
     return coordinate(at: UInt(position)) 
    } 
} 

extension GMSMutablePath: MutableCollection { 

    public subscript(bounds: Range<Index>) -> RandomAccessSlice<GMSPath> { 
     get { return .init(base: self, bounds: bounds) } 
     set { 
      assert(newValue.count == bounds.count) 
      newValue.enumerated().forEach { self[$0] = $1 } 
     } 
    } 

    public override subscript(position: Index) -> CLLocationCoordinate2D { 
     get { return coordinate(at: UInt(position)) } 
     set { replaceCoordinate(at: UInt(position), with: newValue) } 
    } 
} 

С реализацией условного протокола по умолчанию Свифта, я считаю, это очень трудно выяснить, что именно должно быть реализовано.

 Смежные вопросы

  • Нет связанных вопросов^_^