Swift通用协议

时间:2014-08-01 14:43:25

标签: swift

是否可以在swift中使用通用协议?我试过了protocol foo<T>{},这是不合法的。我正在寻找可以类似于Java List<T>界面使用的东西。

3 个答案:

答案 0 :(得分:10)

没有协议的泛型。但还有其他一些东西,当你看它时,它会对泛型有很大的影响。

以下是Swift标准库中的示例:

protocol Generator {
    typealias Element
    func next() -> Element?
}

Swift一书在泛型章节“关联类型”中划线。

答案 1 :(得分:0)

使用带有关联类型声明的协议,可以在Swift中实现Java列表接口的相同功能。

//  Created by Juan Miguel Pallares Numa on 2/24/20.
//  Copyright © 2020 Juan Miguel Pallares Numa. All rights reserved.

import Foundation

protocol List {

    // An associated type gives a placeholder name to a type
    // that is used as part of the protocol.
    associatedtype Element

    func add(index: Int, element: Element)
    func get(index: Int) -> Element
}

class ArrayList<Element>: List {

    private var items: [Element] = []

    func add(index: Int, element: Element) {
        items.insert(element, at: index)
    }

    func get(index: Int) -> Element {
        return items[index]
    }
}

let arrayOfInts = ArrayList<Int>()
let arrayOfStrings = ArrayList<String>()

arrayOfInts.add(index: 0, element: 17)
arrayOfInts.add(index: 1, element: 19)
print("arrayOfInts[1] is \(arrayOfInts.get(index: 1))")
// arrayOfInts[1] is 19

arrayOfStrings.add(index: 0, element: "Generics - The Swift Programming Language")
print("arrayOfStrings[0] is \(arrayOfStrings.get(index: 0))")
// arrayOfStrings[0] is Generics - The Swift Programming Language

/* (lldb) expr print(arrayOfInts.items)
[17, 19]
(lldb) expr print(arrayOfStrings.items)
["Generics - The Swift Programming Language"] */

文档最能说明问题。请参阅中的关联类型 https://docs.swift.org/swift-book/LanguageGuide/Generics.html#ID189

答案 2 :(得分:-1)

可能您可以参考我的答案:https://stackoverflow.com/a/54900296/3564632

除了在协议中具有associatedtype之外,您可能需要做的是实际上在中间有一个通用类充当您的通用接口(类似于java)。