2015-11-15 8 views
1

Я работаю на рамках, чтобы облегчить работу с Key Value наблюдающей и я определил протокол для преобразования родных Swift типов в NSObject следующим образом:Swift расширения для коллекций

public protocol NSObjectConvertible { 
    func toNSObject() -> NSObject 
} 

Расширения встроенные типы было легко, просто нужно определить функцию для преобразования данного типа в соответствующем NSObject:

Когда я получил к типу Array, я ударил несколько коряг, которые я пытался работать. Я не хотел расширять любой тип массива, но только массивы, тип элемента которых сам был NSObjectConvertible. И, естественно, нужен Массив для себя в соответствии с протоколом.

После охоты вокруг на SO, похоже, что расширение типа Array немного сложнее, потому что оно является общим, но расширение SequenceType может быть выполнено. За исключением того, что я не могу и сдерживать тип элемента и, объявить его соответствие протоколу в той же декларации.

Следующая:

extension SequenceType where Generator.Element == NSObjectConvertible : NSObjectConvertible = { 
    public func toNSObject() -> NSObject { 
    return self.map() { return $0.toNSObject() } 
    } 
} 

Производит ошибку компилятора:

Expected '{' in extension

И Карат указывает на ":", где я пытаюсь объявить соответствие протокола. Удаление соответствия протокола компилируется без ошибок, но, очевидно, это не помогает.

Я не уверен, что это ошибка, или если Свифт просто не может (или не хочет) поддерживать то, что я пытаюсь сделать. Даже если я просто определяю расширение, а затем стараюсь заботиться о соответствии в теле, он создает риск передачи последовательностей, которые на самом деле не соответствуют тому, что им нужно.

В лучшем случае это хакерское решение, которое просто терпит неудачу в тех случаях, когда передается последовательность с несоответствующими членами. Я бы предпочел, чтобы компилятор не допустил этого.

(Это в Swift 2.1, Xcode 7.1.1)

+0

Идея этой структуры очень хорошая. Пожалуйста, дайте мне знать, публикуете ли вы его. –

+0

IIRC мы еще не можем реализовать расширения протокола для дженериков с ограничениями :( – HAS

ответ

0

Вы не можете добавить соответствия протокола, к сожалению.