协议类型无法实例化

时间:2016-12-10 10:12:12

标签: initialization swift3 protocols

请考虑以下代码:

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

我该如何解决这个问题?

1 个答案:

答案 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)]