Я работаю на рамках, чтобы облегчить работу с 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)
Идея этой структуры очень хорошая. Пожалуйста, дайте мне знать, публикуете ли вы его. –
IIRC мы еще не можем реализовать расширения протокола для дженериков с ограничениями :( – HAS