为什么“即使有不同的条件界限,也不能有多个一致性”?

2023-11-25

我希望 Swift 能够让我为具有指定条件的类型创建扩展where堵塞。我想象我可以根据具体的泛型类型值使用不同的扩展来扩展相同的泛型类型(T)。但不是。以下示例演示了我的问题:

protocol P {    
    associatedtype Prop 
    var property: Prop { get }
}

enum E<T: P> {
   case single(T)
   case double(T)
}

extension E: P where T.Prop == Int {
   var property: Int {
      switch self {
      case .single(let o): return o.property
      case .double(let o): return o.property * 2
      }
   }
}

extension E: P where T.Prop == String {
   var property: String {
      switch self {
      case .single(let o): return o.property
      case .double(let o): return o.property + o.property
      }
   }
}

struct Int4: P {
   var property: Int {
       return 4
   }
}

struct StringHello: P {
    var property: String {
        return "Hello" 
    }
}

print(E.single(Int4()).property)
print(E.double(StringHello()).property)

下面的错误和注释是编译的结果。

错误:“E”与协议“P”的一致性冲突;即使有不同的条件界限,也不能有多个一致性extension E: P where T.Prop == String {

注意:“E”在此声明符合协议“P”extension E: P where T.Prop == Int {

难道真的不可能吗?为什么?我可以用我的代码做什么才能成功?


一些细节来证明我的真实情况中的问题。
我有一些通用枚举,它与许多不同的包装类型一起使用。

enum Color<T> {
  case red(T), green(T)

  func map<T2>(_ transform: (T) -> T2) -> Color<T2> {
    switch self {
    case .red(let o): return .red(transform(o))
    case .green(let o): return .green(transform(o))
    }
  }
}

很多时候,我需要对 Color 进行不同的扩展,以使其符合不同的协议,具体取决于包装的类型。有时这些协议具有相同的基础(超级)协议,因此,我遇到了当前的问题。有时我无法扩展 Color 以使所有派生协议都符合此基本(超级)协议,因为我需要不同的实现。


难道不可能吗?是和不是。目前在 Swift 中还不可能实现,因为它已经实现了。原则上是可以实施的。

其名称为“重叠一致性”,并且被明确且有意地拒绝。您可以在“考虑的替代方案”部分找到基本原理SE-0143 有条件的一致性。 TL;DR 是:因为它真的很复杂。

如果不了解您到底想用它做什么,我们无法提供太多指导。

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

为什么“即使有不同的条件界限,也不能有多个一致性”? 的相关文章

  • 如何使用泛型而不是注释来实现构建器类?

    我想写一个通用的建造者阶级它包装任何 java 类并提供特定样式的 setter 函数 我不确定这是否可以称为 动态生成的函数 当我有一个豆子般的 Pojo 课时 即 class Pojo public void setValue int
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • 限制类型安全异构容器中的键

    我想使用 Joshua Bloch 的 Effective Java 中描述的泛型类型安全容器模式 但想通过使用枚举来限制可用作键的类 以下是约书亚书中的代码 public class Favorites private Map
  • 如何将渐变应用于 iOS Swift 应用程序的背景视图

    我正在尝试应用渐变作为视图 故事板的主视图 的背景颜色 代码运行 但没有任何变化 我正在使用 xCode Beta 2 和 Swift 这是代码 class Colors let colorTop UIColor red 192 0 255
  • 为什么不自动装箱泛型的 Java 基本类型?

    Java 不允许在通用数据结构中使用原始类型 例如 不允许使用 ArrayList 原因是 原始类型不能直接转换为Object 然而 Java 1 5 确实支持自动装箱 并且包装类在通用数据结构中工作 那么为什么编译器不能将其自动装箱到 A
  • 如何使 SFSpeechRecognizer 在 macOS 上可用?

    我正在尝试使用 Apple 的语音框架在 macOS 10 15 1 上进行语音识别 在 macOS 10 15 之前 语音识别仅在 iOS 上可用 但根据文档 https developer apple com documentation
  • 如何在 SwiftUI 中将阴影应用于内部视图?

    我在周围添加了阴影VStack其中包含我的两个文本字段和一个提交按钮 然而 阴影也被应用到了文本框内的两个文本字段 VStack 我在这里缺少什么导致这种情况发生吗 我尝试添加shadow radius 0 在文本字段上 但它不会改变任何内
  • 由 Xcode 机器人运行时,在文本视图中键入文本时 UI 测试失败

    我有以下 XCTest UI 测试 将文本键入文本视图 let textView app textViews elementBoundByIndex 0 textView tap textView typeText Hello world
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 确定 SceneKit 中 SKVideoNode 的视频大小/长宽比

    如何从 AVPlayer 获取视频的视频大小来设置节点的几何大小 例如 我有一个具有宽度和高度的 SCNPlane let planeGeo SCNPlane width 5 height 5 所以现在我实例化我的视频播放器 let vid
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • 在 Swift 中从 UIScrollView 创建 PDF 文件

    我想从 UIScrollView 的内容创建一个 PDF 文件 func createPdfFromView aView UIView saveToDocumentsWithFileName fileName String let pdfD
  • 如何使用AudioKit保存音频文件?

    我有音频文件 我给它做了一些效果 let pitchshifter AKPitchShifter self audioPlayer pitchshifter shift 10 AudioKit output pitchshifter 如果我
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • 根据 iOS 版本使用不同的类实现?

    iOS 11 最近添加了一个我想使用的新功能 但我仍然需要支持旧版本的 iOS 有没有一种方法可以将同一个类编写两次 并让较新版本的 iOS 使用该类的一个版本 而旧版本的 iOS 使用另一个版本 注 最初我用的是if available
  • Swift 中的 import 语句是否有相关成本?

    阅读字符串宣言 我看到一个段落 https github com apple swift blob master docs StringManifesto md batteries included关于避免Foundation不需要的时候导

随机推荐

  • 如何在VBA中的公式中插入变量

    有人能解决这个问题吗 Sub test Dim i as integer For I 1 to 10 ActiveCell Offset 0 2 Formula Sum E15 i Next I End Sub 你的实际目标不清楚 你可能想
  • Git 日志不显示任何内容

    我有许多 git 存储库 带有提交 每个存储库在运行时都不显示任何内容git log 如果我在项目目录之外运行命令 没有 git 存储库 我会得到 致命 不是 git 存储库 或任何父目录 git 我尝试重新安装 Git 我现在运行的是 1
  • Python模块名称冲突

    我遇到过两个必须使用相同模块名称导入的 Python 模块 例如 import foo 我知道我想要的那个提供了某些功能 例如foo bar 那么有没有一种方法可以循环使用同名的模块 直到找到提供这些功能的模块 或者除了在安装之前重命名模块
  • 大数字的 CSS 字距调整

    我意识到在美国 大量的数字都是用 数以千计之间 所以你会写 1 000 000 00 在南非 是非标准的 可以用作小数点而不是 我们会写 1000000 00读起来很糟糕 典型的解决方案是使用一些空格 1 000 000 00 该解决方案的
  • 在变量周围使用大括号 (Brace) C++

    我正在编程课上学习二维数组 我的老师在没有解释的情况下使用了一些东西 我很好奇我们为什么使用它 由于它与符号有关 我不确定如何谷歌或搜索它 因为这些符号在搜索本身中使用 无论如何 代码是这样的 int small 26 0 large 26
  • 使用 Android api 创建新的同步日历

    我正在尝试在我的帐户上创建一个日历 以填充我从某些网站获得的事件 我搜索并找到了一些新的 android 4 0 日历示例 我对其进行了修改以获得我需要的内容 问题是日历已创建 其中充满了事件 但未与谷歌日历同步 因此在下次同步时它会被删除
  • ForkJoinPool 调度与 ExecutorService

    我对内部调度机制有点困惑ExecutorService和ForkJoinPool 我明白了ExecutorService调度已完成this way 一堆任务排队 一旦线程可用 它将处理第一个可用任务 依此类推 与此同时 一个ForkJoin
  • NHibernate Win Forms 会话管理

    我之前在 Web 应用程序中使用过 NHibernate 我必须承认 我仍在学习 NHibernate 并没有完全掌握会话管理的艺术 所以我想在我正在编写的 Win Forms 应用程序中使用 NHibernate 我听说表单应用程序中的会
  • Bash 在 rsync/subshel​​l exec 语句期间不捕获中断

    Context 我有一个 bash 脚本 其中包含一个子 shell 和一个用于 EXIT 伪信号的陷阱 并且它在执行期间没有正确捕获中断rsync 这是一个例子 bin bash logfile path to file director
  • 有没有针对 SQL Server 的查询优化工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何工具可以对 SQL Server 2005 及更高版本进行查询优化 我已经搜索过并没有找到任何东西 你有什么建议吗 如果在您关闭之前重复了
  • 页面如何告诉浏览器存在 AMP HTML 版本?

    我知道我将有两页 AMP 一页和常规一页 AMP 版本具有到常规版本的规范链接 但常规版本如何指定有可用的 AMP 版本 The AMP 文档发现文档指定您需要在 举例来说 如果您查看已支持 AMP 的发布商的页面 例如http www b
  • 互相关会产生滞后吗?

    假设有两个信号 import numpy dt 0 001 t steps np arange 0 1 dt a sig np sin 2 np pi t steps 4 5 b sig np sin 2 np pi t steps 4 我
  • 如何在 Neo4j/Cypher 中返回复合对象

    我想使用 cypher 从 Neo4j 返回一个复合对象来整理我的查询 举个例子 我有一个用户帐户对象 其权限存储为关系 权限是复杂的对象 因此无法嵌套 它们现在通过关系 HAS PERMISSION 链接 我想要做的是返回已嵌套权限的完整
  • 将整数插入 Start 中的阿拉伯字符串

    我试图将整数添加到阿拉伯字符串但没有成功 Arabic String Astr String with Integer 1 num 1 Adding Strings r Astr num r num Astr 输出 1 期望的输出 1 我想
  • 模拟器中的 iOS 6 自动旋转与实际 iOS 6 设备不同

    我的应用程序不会在 iOS 6 GM 模拟器中自动旋转 但它会在设备上的相同版本的 iOS 中自动旋转 这可能是模拟器的错误吗 该应用程序正在使用已弃用的自动旋转方法 但它们在设备本身上运行良好 这让我想知道模拟器 API 是否不同 它应该
  • Qt SDK、Apwrapper:它是什么,它有什么作用。

    我已阻止 Visual Studio 的网络连接 使用 Visual Studio 添加安装 Qt SDK 后 我收到一条错误消息 无法连接到 AppWrapper 卸载了 SDK 并且不再尝试连接到 AppWrapper 随 Qt 安装的
  • 关于未引用变量的 JavaScript 闭包

    我知道有关闭包的精彩帖子here and here 但似乎都没有解决我想到的具体情况 这个问题最好用代码来证明 function foo var x var y whatever return function bar alert y va
  • Python 解释器如何在动态类型中工作?

    我读过这个问题 但它没有给我明确的答案 Python解释器如何寻找类型 python解释器如何知道变量的类型 我不是在寻找如何获得类型 我在这里看看幕后发生的事情 在下面的示例中 它如何将类 int 或 string 与我的变量关联起来 它
  • jQuery 图像加载回调

    加载后动态地将图像添加到页面 然后进行用户交互 并且在该图像完全加载后启动功能时遇到问题 我认为使用 jQuery load 方法会很好 但是根据我的控制台和一堆文档 log它从未执行过的业务 见下文 谢谢 body append img
  • 为什么“即使有不同的条件界限,也不能有多个一致性”?

    我希望 Swift 能够让我为具有指定条件的类型创建扩展where堵塞 我想象我可以根据具体的泛型类型值使用不同的扩展来扩展相同的泛型类型 T 但不是 以下示例演示了我的问题 protocol P associatedtype Prop v