如何根据泛型类型执行泛型结构体方法的不同实现?

2024-03-09

我有一个通用结构。我在扩展中的结构中添加了一个方法,如下所示-

struct CustomStruct<T> {
    let data: T?
}
extension CustomStruct {
    func method1() {
    }
}

当类型为T is String,我想要method1来执行不同的动作。 我尝试添加另一个带有泛型类型约束的扩展,如下所示-

extension CustomStruct where T == String {
    func method1() {
        print("method1 for string called")
    }
}

但是,执行以下代码时不会调用上述方法。

let struct1 = CustomStruct<String>(data: "something")
struct1.method1()

谁能指出如何解决这个问题?

编辑-上面的代码没有指出我遇到的问题,正如@scriptable和@matt所指出的。下面的代码指出了我遇到的问题

struct CustomStruct<T> {
    let data: T?
}
extension CustomStruct {
    func method1() {
        print("method1 for all type called")
    }
}
extension CustomStruct where T == String {
    func method1() {
        print("method1 for string called")
    }
}

func callMethod1<T>(customStruct: CustomStruct<T>) {
    customStruct.method1()
}

let struct1 = CustomStruct<String>(data: "something")

callMethod1(customStruct: struct1)

无法从您提供的示例中重现该问题。我假设您遇到了一个更复杂的问题,您试图将其归结为这个问题,但您错误地将其归结为问题。我猜你实际看到的是这样的:

struct CustomStruct<T> {
    let data: T?
    func method1() {
        print("original method1")
    }
    func method2() {
        method1()
    }
}
extension CustomStruct where T == String {
    func method1() {
        print("method1 for string called")
    }
}
let struct1 = CustomStruct(data: "something")
struct1.method1() // method1 for string called
struct1.method2() // original method1

正如你所看到的,如果我们调用method1我们自己直接通过扩展。 (这就是为什么无法从您给出的示例中重现该问题的原因。)但是如果我们调用method2,这称为method1,我们得到原来的method1,不属于扩展名。

这是真正的问题吗?

如果是这样,您可能遇到了一个常见的误解,即您试图使用where子句来启用某种基于类型的调度。这是错误的,而且不是什么where子句是为了.正如乔丹·罗斯所说here https://bugs.swift.org/browse/SR-10549:

在 Swift 中,被调用的函数是在调用的地方选择的。

获得基于类型的调度(正如他继续说的)的方法是通过标准方法,例如重写(多态性)和重载(不同的方法签名)。或者您当然可以自己检查类型并实时做出决定。

换句话说:您不能使用扩展来执行方法重写。但这正是您正在尝试做的事情。您不能使用 where 子句将结构转换为类(动态调度),或执行重载工作。

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

如何根据泛型类型执行泛型结构体方法的不同实现? 的相关文章

  • 协议本身不符合?

    为什么这段 Swift 代码无法编译 protocol P struct S P let arr P S extension Array where Element P func test
  • 使用 Swift 3 和 Realm 同步 Apple Watch 和 iPhone

    我需要从 Apple Watch 和 iPhone 显示和修改我的数据结构 数据库 我目前正在使用一个简单的领域结构 其中有一个对象 A 和一个可以容纳大量 A 的对象 B 因此 在 iPhone 上 用户可以创建 B 并添加 A 当然还可
  • 动态高度 UITableViewCell 内的动态高度 UICollectionView

    我有一个水平的UICollectionView固定到 a 的所有边缘UITableViewCell 集合视图中的项目是动态调整大小的 我想让表视图的高度等于最高集合视图单元格的高度 视图的结构如下 UI表格视图 UITableViewCel
  • 如何使用 PKAddPassButton 创建“添加到苹果钱包”按钮以进行本地化通行证

    在我的 iOS 项目中 我有一个屏幕 允许用户创建苹果通行证并将其添加到钱包中 Apple 建议使用 PKAddPassButton 创建 添加到苹果钱包 按钮 当我尝试使用以下代码创建苹果通行证时 let passButton PKAdd
  • Swift Firebase - 如何在使用 queryOrdered(byChild: ).queryEqual(toValue: ) 时获取所有 k/v

    root reviews postABC postId reviewXYZ I want everything under this reviewUID buyerUID 01010 text fast shipping responseT
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • CIAdditionCompositing 给出不正确的效果

    我正在尝试通过平均其他几个图像来创建图像 为了实现这一点 我首先将每个图像变暗 其系数等于我平均的图像数量 func darkenImage by multiplier CGFloat gt CIImage let divImage CII
  • UIApplication.shared.delegate 相当于 SceneDelegate xcode11?

    我在 SceneDelegate 中定义了一个 let 属性 我希望一些 ViewController 能够在场景中访问它 在 UIKit 中 我可以像这样访问 App Delegate 属性 UIApplication shared de
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • 在 Firebase 中构建聊天应用的数据

    我正在关注 Firebase 指南结构化数据 https firebase google com docs database ios structure data flatten data structures对于聊天应用程序 他们建议的结
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • CustomNSError 协议有什么作用以及为什么我应该采用它?

    什么是CustomNSError协议的用途以及为什么我应该采用它 Apple提供的文档仅指出 描述错误类型 具体提供域 代码和 用户信息字典 我已经在谷歌上搜索过 但找不到与我的问题相关的任何内容 每种类型都符合Error协议是隐含地桥接的
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我

随机推荐

  • 在 Three.js 中使用 CanvasRenderer 绘制线条比 WebGLRenderer 更平滑

    我一直遇到一个问题 即 Three js 的 CanvasRenderer 渲染线比 WebGLRenderer 平滑得多 WebGLRenderer 似乎没有应用抗锯齿功能 当我从 中获取 Three js 画布 线条 随机示例时http
  • TextView state_pressed/state_focused/state_selected 样式更改

    我正在尝试根据 TextView 的状态更改其样式 我的 styles xml 包含
  • 将 CSS 模块 kebab-case 类名转换为 Next.js 中的驼峰命名法

    我正在使用 CSS 模块 scss 与 Next js 并有一个 kebab 命名约定 换句话说 是这样的 member btn background fff 我面临的问题是 为了使用它className我必须这样做styles membe
  • 是否可以捕获音频输出并对其应用效果?

    我希望能够使用 NET 和 DirectSound所有输出来自我的音频设备的声音并对它应用效果 我快速浏览了 MSDN 上的文档 似乎没有任何关于如何执行此类操作的解释 我在其他地方读到 您最好编写一个驱动程序放在真正的音频驱动程序前面 并
  • Ruby IMAP 登录错误异常

    使用我的 Ruby 脚本 imap Net IMAP new imap gmail com imap login email protected cdn cgi l email protection password 我得到以下异常 A c
  • 如何从 Java websocket 服务器访问客户端主机名、http 标头等?

    我已经遵循了许多教程和示例代码 但我还没有看到一种访问客户端的 HTTP 标头 主机名等的方法 就像我们在 Servlet 的请求对象中那样 我该怎么办 假设我将 onOpen 定义为 OnOpen public void onOpen S
  • 如果我添加 ,pageX pageY 无法在 IE8 中工作

    嘿伙计们 我有以下脚本 当我移动鼠标时它会给出光标位置 这个脚本在 chrome FF 甚至 IE 8 没有 doctype html 如果添加 DOCTYPE html到 html 页面 它给我对象不支持此属性错误 下面给出的行导致了问题
  • 如何对 XMLAGG 函数聚合的字段进行排序?

    我有下表 Part number seq nbr Super narrative 1 1 When replacing 1 2 part with following parts 1 3 note follwing are now avai
  • Angular-cli 构建文件夹结构

    默认的 angular cli 构建生成具有非常扁平结构的 dist 文件夹 资产文件夹和 js html 文件 有没有办法创建 fe 脚本文件夹并在构建过程中将所有js文件放入其中 CLI 尚不完全支持这一点 但它确实提供了一些有用的工具
  • 从谷歌地图获取家庭/办公室地址

    我有一个基于地图的 Android 应用程序 并提供使用 Gmail 帐户登录的功能 现在 设备上的谷歌地图已经保存了用户的家庭和办公室地址 是否可以在无需用户输入的情况下获取这些数据 您可以使用以下命令对地址进行地理编码谷歌地理编码API
  • 如何在nib中轻松设计UIScrollView的内容

    我有一个滚动视图 它必须显示大于可用显示区域的视图 我希望轻松设计用户界面 而无需每次必须进行一些更改时上下移动嵌入视图 问题是可见区域之外的所有内容在 IB 中都是不可见的 是否有任何开关或技巧可以使 IB 中的所有内容都可见 UPDAT
  • Angular2 http获取请求结果变成404

    尝试在 Angular 2 TypeScript 中运行简单的 http get 调用 给予https angular io docs ts latest tutorial toh pt6 html https angular io doc
  • Java 8 的默认垃圾收集器

    Java 8 的默认垃圾收集器是什么 当我检查 JMX Beans 时 它们显示它是新一代的并行收集器和老一代的旧串行收集器 默认垃圾收集器 Java 7 并行 GC Java 8 并行 GC Java 9 G1 GC Java 10 G1
  • 对嵌套列表内的列表进行排序

    我有一个嵌套列表 9 8 7 8 7 6 7 6 5 6 5 4 5 4 3 4 3 2 3 2 1 我需要对列表中的列表进行排序才能创建 7 8 9 6 7 8 5 6 7 4 5 6 3 4 5 2 3 4 1 2 3 我该怎么做呢 你
  • R 闪亮的 AngularJS 工作

    我正在创建一个仪表板 其中 R 和 D3 与库 闪亮 一起运行 这工作得非常好 现在我想将 D3 代码转换为模块化对象 这将节省我大量的编码并使其可供其他人使用 我的想法是做到这一点
  • 按自定义字段日期列出自定义帖子类型

    我正在使用 Wordpress 和 WP Types 插件 需要按自定义字段日期对 CPT 进行排序 这工作正常 args array post type gt parties paged gt paged meta key gt wpcf
  • 在 Windows 7 上使用 powershell 2.0 下载文件

    这是我下载文件的脚本 我替换了下载的网址 因为它是一个私有云站点 我到处搜索 他们都说这是在旧版本的 PS 中下载的正确方法 但我不断收到错误 Exception calling DownloadFile with 2 argument s
  • 有 jQuery 图像和视频幻灯片库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个 jQuery 库可以用来制作图像幻灯片 并在幻灯片查看区域中嵌入视频 从而带来额外的好处
  • 如何仅与syncdb同步自定义权限?

    是否可以让manage pysyncdb命令仅将自定义权限同步到auth permission桌子 我不希望为应用程序模型安装默认的三个权限 即foo add bar foo change bar foo delete bar 我在模型类中
  • 如何根据泛型类型执行泛型结构体方法的不同实现?

    我有一个通用结构 我在扩展中的结构中添加了一个方法 如下所示 struct CustomStruct