【发布时间】:2015-11-15 13:50:16
【问题描述】:
我正在开发一个框架,以便更轻松地使用 Key Value Observing,并且我已经定义了一个将原生 Swift 类型转换为 NSObject 的协议,如下所示:
public protocol NSObjectConvertible {
func toNSObject () -> NSObject
}
扩展内置类型很容易,只需定义将给定类型转换为适当 NSObject 的函数:
extension Int8: NSObjectConvertible {
public func toNSObject () -> NSObject {
return NSNumber(char: self)
}
}
当我使用 Array 类型时,我遇到了一些障碍,我试图解决这些障碍。我不想扩展任何数组类型,而只想扩展元素类型本身为 NSObjectConvertible 的数组。并且自然需要 Array 自身符合协议。
在 SO 上四处寻找之后,看起来扩展 Array 类型本身有点困难,因为它是通用的,但是可以扩展 SequenceType。除了我不能同时约束元素类型和在同一个声明中声明它与协议的一致性。
以下内容:
extension SequenceType where Generator.Element == NSObjectConvertible : NSObjectConvertible = {
public func toNSObject () -> NSObject {
return self.map() { return $0.toNSObject() }
}
}
产生编译器错误:
扩展中应为“{”
克拉指向我试图声明协议一致性的“:”。删除协议一致性编译不会出错,但显然无济于事。
我不确定这是否是一个错误,或者 Swift 是否根本不能(或不想)支持我正在尝试做的事情。即使我只是简单地定义了扩展,然后尝试处理主体中的一致性,它也会产生传递不真正符合它们应该的序列的风险。
充其量这是一个 hacky 解决方案,如果通过了包含不合格成员的序列则失败。我宁愿让编译器阻止它发生。
(这是在 Swift 2.1、Xcode 7.1.1 中)
【问题讨论】:
-
这个框架的想法很不错。如果您发布它,请告诉我。
-
IIRC 我们还不能在有约束的泛型上实现协议扩展:(