【问题标题】:Generic conforming a protocol array符合协议数组的泛型
【发布时间】:2017-02-27 13:15:22
【问题描述】:

对于符合ModelProtocol 协议的唯一对象,我可以通过编写来成功测试泛型:

if let _ = T.self as? ModelProtocol.Type { /* Do some stuff */}

但是如果我需要测试[ModelProtocol] 协议的一致性,我会卡住。我试过了:

if let _ = T.self as? [ModelProtocol.Type] { /* Do some stuff */}

但是 Xcode 会抛出一个警告:

从“T.Type”转换为不相关类型“[ModelProtocol.Type]”总是失败

我应该如何处理这种情况?

【问题讨论】:

  • T 是通用参数吗?如果是,您是否考虑过添加通用约束?
  • 是的,它是一个通用参数,不,我没有
  • 测试[ModelProtocol]协议的一致性”是什么意思? [ModelProtocol] 是一个数组,而不是一个协议。您的意思是要检查T 是否为[ModelProtocol]

标签: arrays swift generics protocols


【解决方案1】:

您可以使用带有约束的泛型函数来做到这一点。例如:

//: Playground - noun: a place where people can play

import Cocoa

protocol ModelProtocol {
    var name: String { get }
}

struct Model: ModelProtocol {
    let name: String
}

func myFunction<T: Sequence>(sequence: T) where T.Iterator.Element == ModelProtocol {
    for model in sequence {
        print(model.name)
    }
}

let models: [ModelProtocol] = [Model(name: "one"), Model(name: "two")]
myFunction(sequence: models)

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多