在泛型类中使用泛型协议

2024-01-12

我定义了一个协议LLNodeType:

protocol LLNodeType {
    typealias T
    var firstNode: LLNode<T>? { get }
}

LLNode<T>只是一个简单的泛型类,其中包含类型的存储属性N.

class LLNode<N> {
    var content: N
    ...
}

为了符合LLNodeType因此,第一号议定书延长了LLNode如下:

extension LLNode: LLNodeType {
    typealias T = N

    var firstNode: LLNode<T>? {
        return self
    }
}

我还定义了一个泛型类LLLinkedList包含一些使用泛型类型的属性和函数L:

class LLLinkedList<L> {
    var rootNode: LLNode<L>?
    ...
}

我扩展了这个类以符合LLNodeType:

extension LLLinkedList: LLNodeType {
    typealias T = L

    var firstNode: LLNode<T>? {
         return self.rootNode
    }
}

我找到了一种穿越的方式LLNodeType的方法LLLinkedList作为常规类型并将其用于append method:

func append<NT: LLNodeType>(nodeSequence: NT) {
    let nodes = LLLinkedList(nodeSequence: nodeSequence) 
    ...
}

正如在第一个声明中所看到的append方法,我还定义了一个初始化程序LLLinkedList,它需要一个参数nodeSequence类型的LLNodeType:

convenience init<NT: LLNodeType where NT.T == L>(nodeSequence: NT) {
    self.init()
    self.rootNode = nodeSequence.firstNode
}

初始化器只需要一个nodeSequence这符合LLNodeType,尽管使用类型受到限制T等于L.

The firstNode的财产nodeSequence因此,符合这些条件应返回LLNode<L>?.

因此声明self.rootNode = nodeSequence.firstNode应该是完全可能的,因为self.rootNode属于类型LLNode<L>?.


当我尝试编译代码时,出现错误:

<stdin>:501:33: error: extra argument 'nodeSequence' in call
let nodes = LLLinkedList(nodeSequence: nodeSequence)

501:33指的是第一个语句append method.

怎么可能有一个extra argument 'nodeSequence'如果我用一个名为的参数定义初始化程序nodeSequence?


这是一个代码示例,仅包含与问题相关的部分:SwiftStub 代码 http://swiftstub.com/137821597/


问题是你的append函数不强制类型LLNodeType.T对于您要附加的序列:

func append<NT: LLNodeType>(nodeSequence: NT) {
    // here, nodeSequence could be of a String, an Int, who knows...
    let nodes = LLLinkedList(nodeSequence: nodeSequence) 
    ...
    // but here you try to append it to the existing list...
    // what if it's not a list of the same type?
    if self.isEmpty {
        self.rootNode = nodes.rootNode
    } else {
    /// appends a node by pointing the last nodes pointer ('nextNode' property) to the new node
        self.lastNode!.nextNode = nodes.rootNode
    }
}

您可以通过强制只附加与您的类型相同的序列来解决此问题

func append<NT: LLNodeType where NT.T == L>(nodeSequence: NT) {
    // etc...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在泛型类中使用泛型协议 的相关文章

  • 检测 AVAudioPlayer 中的播放结束

    我有几个短的 mp3 声音 我将它们存储在数组中 并希望连续播放它们 有什么方法可以检测 AVAudioPlayer 何时停止播放 以便我可以调用完成处理程序并播放下一个声音 我知道有一个委托 但我正在使用 Playground 和 SKS
  • 如何将字符串日期转换为 NSDate?

    我想转换字符串 2014 07 15 06 55 14 198000 00 00 to an NSDate在斯威夫特 尝试这个 let dateFormatter NSDateFormatter dateFormatter dateForm
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • iOS 中的构建对象文件扩展名是什么?

    当我在项目中构建java对象类时 将创建带有 class扩展名的构建文件 并且人类不可读 快速构建文件怎么样 example car java gt build gt car class 构建后会是什么 car swift gt build
  • 我的游戏中应该有多少个视图控制器?

    我开始使用 spritekit 构建我的第一个游戏 现在我只有一个视图控制器来呈现开始屏幕场景 override func viewDidLoad super viewDidLoad let scene StartScreenScene C
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们
  • 类方法作为 JavaScript 中的事件处理程序?

    JavaScript 中是否有最佳实践或通用方法将类成员作为事件处理程序 考虑以下简单示例
  • iOS:Swift - 如何在触摸时向地图添加精确定位并获取该位置的详细地址?

    我想在 iOS 地图的触摸上添加注释并获取各个位置的详细地址 地标 我如何在 Swift 中实现这一目标 提前致谢 要对地图上的触摸做出反应 您需要为地图视图设置点击识别器 in viewDidLoad let gestureRecogni
  • 列表不符合 Encodable

    因此 我正在使用领域 并且两个模型之间有以下关系 A unit has many tests Unit model class Unit Object Decodable objc dynamic var id String let tes
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • 运算符“==”不能应用于“T”和“T”类型的操作数

    在下面的代码示例中 编译器抱怨x Id reference Id 运算符 不能应用于 TId 和 TId 类型的操作数 类似的问题已被问到 SO 并通过替换来解决 运算符与IEquatable lt gt Equals or Equalit
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con
  • 如何快速更改按钮图像?

    我正在开发一个有按钮的应用程序 该按钮没有文本 图像或背景 所以我想做的就是在viewDidLoad函数中给它一个图像 这就是我所拥有的 IBOutlet var tapButton UIButton override func viewD
  • MySQL InnoDB 约束不起作用

    我偶然发现 innoDB 约束的奇怪行为 但找不到原因 我有包含数据的表格 下面列出了它们的结构 CREATE TABLE contents id int 10 unsigned NOT NULL AUTO INCREMENT title
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • Swift getnameinfo IPv6 结果不可靠

    我有以下扩展sockaddr extension sockaddr Indicates if this is an IPv4 address var isIPv4 Bool return sa family UInt8 AF INET In
  • 面向对象的铸造错误[重复]

    这个问题在这里已经有答案了 将派生类强制转换为基类 我有一个通用的基本抽象类 继承自 IComparable 其定义如下 public abstract class BaseClass
  • 在 UIView 中实现自定义 StaggereGrid,就像 SWIFT 中的 Etsy 应用程序一样

    我想实现一个像 Etsy 应用程序一样的 StaggeredGrid 但我对此一无所知 你能给我一些建议吗 这是我需要做的事情的屏幕截图 None
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self

随机推荐

  • 服务和组件属性之间的 Angular2 数据绑定

    我需要对服务和组件属性之间的绑定以及 Angular2 中的数据绑定进行一些澄清 假设我有一个服务 单例 和一个组件 export class Service name Luke object id 1 getName return thi
  • 使用python提取一个句子

    如果该句子中存在特定单词 我想提取确切的句子 谁能告诉我如何用 python 做到这一点 我使用了 concordance 但它只打印单词匹配的行 快速提醒一下 断句实际上是一件非常复杂的事情 句号规则也有例外 例如 先生 或 博士 还有各
  • AttributeError:“KMeans”对象没有属性“inertia_”

    from sklearn cluster import KMeans import numpy import pandas as pd from pandas import read csv boston read csv desktop
  • 计算两个点阵列之间的成对角度矩阵

    我有两个点向量 x and y 成形 n p and m p 分别 举个例子 x np array 0 0 16341 0 98656 0 05937 0 25205 0 96589 0 05937 0 25205 0 96589 0 11
  • 在函数 (group_by) 中使用 dplyr 时出现问题

    我想使用 dplyr 进行一些数据操作 背景 我有一个调查权重和一堆变量 主要是李克特项目 我想对有和没有调查权重的每个类别的频率和百分比进行求和 举个例子 让我们只使用性别变量的频率 结果应该是这样的 gender freq freq w
  • 哪个 .NET 库具有写时复制集合?

    我正在搜索要在 C 程序中使用的 NET 写时复制集合 例如列表 字典等 哪些集合具有该属性 包括参考FSharp Core 然后你就可以访问多种不可变的集合 Set List Map etc 这些位于Microsoft FSharp Co
  • 如何在 Google Test 中使用不同模板测试多个模板类的相同行为?

    我正在练习 C 17 中的排序算法 并按如下方式实现了我的单元测试 以下编译和所有测试都是绿色的 template
  • Funq IoC 容器是否支持属性注入?

    我正在寻找一个 IoC 容器在我的 Compact Framework 应用程序中使用 尝试 Funq 我发现我找不到用它进行属性注入的方法 我浏览了该项目网站上的讨论及其单元测试 但我找不到任何属性注入的示例 Funq 支持属性注入吗 嗯
  • Django 迁移到新数据库

    我刚刚加入一个使用 Django 的项目 并尝试初始化我自己的开发服务器 当我尝试这样做时 我的一个应用程序的迁移失败 此应用程序的模型有一个 sorl thumbnail ImageField 用于添加徽标 尝试迁移时 我收到以下错误消息
  • [over.load]/1 中下面突出显示的句子是什么意思?

    下面突出显示的句子的含义是什么 它与函数模板有什么关系吗 过载 1 http eel is c draft over load 1 并非所有函数声明都可以重载 那些不能成为的 此处指定了重载 如果程序包含以下内容 则该程序是格式错误的 同一
  • ::after 伪元素出现在之前

    我试图在渐变的顶部和底部创建一个微妙的波浪 但是 after 伪元素出现在主要内容之前而不是之后 目前它显示为 before after 主要内容 但我希望它显示为 before 主要内容 after 这是我的代码 gradient bac
  • couchDB、python 和身份验证

    我已经安装了 couchDB v 0 10 0 并尝试通过从 couchDB wiki 下载的 Couch 类中的 python 与它对话 问题是 Create database mydb error unauthorized reason
  • 对“omp_get_max_threads_”的未定义引用

    我在尝试编译项目时遇到以下错误 fortran 使用 gfortran 对 omp get max threads 的未定义引用 对 omp get thread num 的未定义引用 问题是 我的 GCC 版本是 4 4 3 它应该支持
  • 运行 Julia .jl 文件

    我是朱莉娅的新手 刚刚完成了我的第一个程序 我在 julia studio 中编写了代码 并在该程序中对其进行了测试 它为我提供了所有正确的输出 但 shell 将输出分开 就好像它是两个不同的执行一样 我想知道这是否是我的编译器的问题 所
  • R ggplot2 对只有几个数据点的线图进行轻微平滑

    不确定这是否是一个编程问题 如果我有下面的数据 它会生成一个 尖峰 图表 并且我想使用 ggplot2 生成一个稍微平滑的图表 我该如何最优雅地处理它 通常的平滑方法去除了太多信息 我正在考虑的一种方法是在当前数据集之间插入额外的两个数据点
  • 使用空手道框架时,如何有选择地忽略构建中的某些 .feature 文件?

    我必须忽略使用空手道框架的集成测试套件的某些 feature 测试文件 有什么方法可以有选择地排除某些文件 是的 答案是tags https github com intuit karate test suites Example igno
  • 制作Asus google Nexus 7的模拟器

    我有 android sdk 更新到最新版本 v21 现在我想要的是 制作 Asus google Nexus 7 的模拟器 包含 800 x 1280 分辨率和 216 dpi 当我将 sdk 更新到最新版本时 我无法编辑模拟器当前的 d
  • JSP 自定义标记中的 i18n 翻译

    是否可以编写自定义 JSP 标记来获取 i18n 消息键并输出给定 请求的翻译短语 通常在 JSP JSTL 中 我这样做
  • Google Spell API 和 TinyMCE

    我刚刚使用说明成功实现了 TinyMCE 的拼写检查插件here http ondotnet deap nu 2009 01 implementing tinymce spellchecker with html 不过 我对这个结尾段落感到
  • 在泛型类中使用泛型协议

    我定义了一个协议LLNodeType protocol LLNodeType typealias T var firstNode LLNode