是否有可能有一个通用协议的快速?我试过protocol foo<T>{}
,这是不合法的。我正在寻找类似于Java的List<T>
接口的东西。
发布于 2014-08-01 06:59:39
协议中没有泛型这样的东西。但是还有其他的东西,当你看它的时候,它对仿制药有很大的意义。
以下是Swift标准库中的一个示例:
protocol Generator {
typealias Element
func next() -> Element?
}
斯威夫特的书在泛型一章“关联类型”中触及了表面。
发布于 2020-02-24 10:32:20
可以使用带有关联类型声明的协议在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中的关联类型
https://stackoverflow.com/questions/25082769
复制