【问题标题】:Swift Generic ProtocolSwift 通用协议
【发布时间】:2020-02-25 02:32:20
【问题描述】:

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

【问题讨论】:

  • List<T> 在 Swift 中是 Array<T>... 那里不需要协议。
  • 好吧,我不想专门列出一个列表,我想制作一个自定义提供程序接口。 List 只是 java 中的接口,我知道它没有在 swift 中实现(作为协议)并且是一个通用接口
  • 哦,我忘了List<T>在Java中是一个接口而不是一个抽象类。我现在明白你的问题了。

标签: swift


【解决方案1】:

协议没有泛型之类的东西。但是还有一些其他的东西,当你看它时,它与泛型很相似。

这是一个取自 Swift 标准库的示例:

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

Swift 书在泛型章节“关联类型”中略作介绍。

【讨论】:

  • 完美,谢谢!我通读了所有文档,但完全忘记了类型别名。
【解决方案2】:

使用带有关联类型声明的协议,可以在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多