请考虑以下代码:
protocol Color {
var color: UIColor { get }
}
struct Ball : Color {
var color: UIColor
}
let ball = Ball(color: .white)
print(ball)
这样可行,并产生:
Ball(color: UIExtendedGrayColorSpace 1 1)
现在,我想在协议中创建一个函数,给定一个颜色数组,返回一个项目数组(球或符合Color
的任何其他类型)与该颜色:
extension Color {
func multipleColors(colors: [UIColor]) -> [Color] {
var coloredItems = [Color]()
for item in colors {
// What do I put here ???
}
return coloredItems
}
}
然后:
let coloredBalls = ball.multipleColors(colors: [.red, .green, .blue])
我无法弄清楚要放在括号内的内容。例如(没有双关语),如果我尝试:
coloredItems.append(Color(color: item))
错误是:
'Color' cannot be constructed because it has no accessible initializers
然后我在协议中添加了一个init方法,错误更改为:
protocol type 'Color' cannot be instantiated
我该如何解决这个问题?
答案 0 :(得分:1)
您正在尝试创建协议Color(color: item)
的实例,这是不可能的。
在下面找到一个可能的通用解决方案。到目前为止,我找不到一个非静态(好的)解决方案。
protocol Color {
var color: UIColor {get set}
init(color: UIColor)
}
struct Ball : Color {
var color: UIColor
}
extension Color {
static func item<T:Color>(_ item: T, inColors colors: [UIColor]) -> [T] {
var coloredItems = [T]()
for color in colors {
let newColoredItem = T.init(color: color)
coloredItems.append(newColoredItem)
}
return coloredItems
}
}
let ball = Ball(color: .white)
let coloredBalls = type(of:ball).item(ball, inColors: [.red, .green, .blue])
print(coloredBalls)
打印:
[Ball(color: UIExtendedSRGBColorSpace 1 0 0 1), Ball(color: UIExtendedSRGBColorSpace 0 1 0 1), Ball(color: UIExtendedSRGBColorSpace 0 0 1 1)]