加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – 从Swift中的数组转换为正则

发布时间:2020-12-14 05:35:16 所属栏目:百科 来源:网络整理
导读:我有一个协议称为复合. 该协议有一个数组复合:[Composite] 我也有一个泛型子类GenericSubclass T:复合 当迭代数组时,最好我可以想出这样: for item in composites { if let item = item as? GenericSubclassA { let sc = SomeOtherClassA } else if let i
我有一个协议称为复合.

该协议有一个数组复合:[Composite]

我也有一个泛型子类GenericSubclass< T>:复合

当迭代数组时,最好我可以想出这样:

for item in composites {
    if let item = item as? GenericSubclass<A> {
        let sc = SomeOtherClass<A>
    } else if let item = item as? GenericSubclass<B> {
        let sc = SomeOtherClass<B>
    } //and so on...
}

有没有办法得到一个GenericSubclass,而不指定Generic?在我的用例中,我绝对不需要知道T.我只需要实例化具有相同泛型类型的另一个类.

任何帮助深表感谢.

目前还不清楚您使用所选择的“通用”(双关语)类名称来完成什么.我不认为有办法直接完成你想要的.即你不能把它当作一个通用的T,因为编译器需要一些方法来确定什么T在运行时使用.

但是,解决问题的一个方法是将API提升到Composite协议中:

protocol Composite {
    var composites: [Composite] { get set }
    func otherClass() -> OtherProtocol
}

protocol OtherProtocol { }

class GenericSubclass<T>: Composite {
    var composites: [Composite] = []

    func otherClass() -> OtherProtocol {
        return SomeOtherClass<T>()
    }
}

class SomeOtherClass<T>: OtherProtocol {}

所以现在当你实现你的循环,你可以依靠这个事实,因为每个元素都是一个Composite,你知道它必须通过otherClass()方法提供一个OtherProtocol的实例:

var c = GenericSubclass<Int>()
c.composites = [GenericSubclass<Double>(),GenericSubclass<Int>(),GenericSubclass<Character>()]

for item in c.composites {
    let sc = item.otherClass()
    print(sc)
}

或者,如果只有GenericSubclass应该销售OtherProtocol,则可以使返回类型为可选,并为Composite的所有其他实现定义一个扩展名:

protocol Composite {
    var composites: [Composite] { get set }
    func optionalClass() -> OtherProtocol?
}

extension Composite {
    func optionalClass() -> OtherProtocol? {
        return nil
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读