【问题标题】:Swift: array of structs implementing protocolSwift:实现协议的结构数组
【发布时间】:2015-10-11 14:43:59
【问题描述】:

我不明白为什么我不能将结构数组(实现协议)传递给期望符合该协议的事物数组的函数。

我在以下位置收到编译错误: r.setDataToRender(toRender) --> 无法将类型 [Process] 的值转换为预期的参数类型 [MyType]。

我可以做的是创建一个数组 [MyType] 并附加 toRender 的每个元素并传递该新数组,但这似乎效率低下。

//: Playground - noun: a place where people can play
typealias MyType = protocol<Nameable, Countable>

protocol Nameable {
    func getName() -> String
}

protocol Countable {
    func getCount() -> Int
}

struct Process : MyType {
    let processName: String?
    let count: Int?

    init(name:String, number: Int) {processName = name; count = number}
    func getCount() -> Int {return count!}
    func getName() -> String {return processName!}
}

class Renderer {
    var data  = [MyType]()

    func setDataToRender(d: [MyType]) {
        data = d
    }

    func setOneProcessToRender(d: Process) {
        var temp = [MyType]()
        temp.append(d)
        data = temp
    }
}

var toRender = [Process]()
toRender.append(Process(name: "pro1",number: 3))

let r = Renderer()
r.setOneProcessToRender(Process(name: "pro2",number: 5)) // OK
r.setDataToRender(toRender) // KO

var str = "Hello, Stackoverflow!"

【问题讨论】:

    标签: arrays struct protocols swift2


    【解决方案1】:

    如果你把它改成这样就可以了:

    var toRender = [MyType]()
    toRender.append(Process(name: "pro1",number: 3))
    

    您的函数setDataToRender 需要一个类型为MyType 的数组。当你实例化你的数组时,你把它输入到Process。尽管Process 实现了MyType,但它与MyType 不同。因此,您必须将toRender 创建为MyType 类型的数组才能将其发送到setDataToRender

    【讨论】:

    • 嗨 :)。是的,我知道,这相当于我在 setOneProcessToRender() 中所做的。执行 r.setDataToRender(toRender.map{$0}) 也有效,我也不明白为什么,因为如果我将 toRender.map{$0} 的结果放入 var 中,Xcode 会告诉我该 var 的类型是[过程]。所以仍然试图理解为什么 Process “满足” MyType 但 Process 数组不满足期望 MyType 数组的函数。如果我将 setOneProcessToRender 更改为期望 MyType,则可以发送 Process。因此,适用于单个元素的方法不适用于包含这些相同元素的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多