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