使用泛型参数关闭

2024-01-29

我在将以下函数编写为闭包时遇到问题

func myfunc<S where S: MyProtocol, S: MySuperClass>(param: S) { ... }

I tried

let myClosure = {<S where S: MyProtocol, S: MySuperClass>(param: S) in ... }

,但它不起作用。

关于我如何实现这一目标有什么建议吗?


我相信你所要求的没有意义(与 Swift 无关)。虽然我有兴趣被证明是错误的,但我不相信这可以用任何强类型语言合理地创建。 (编辑:继续我的研究,我相信这在具有一流多态性的语言中是可能的,但我不知道任何通用语言实际上具有此功能。)

let myClosure = {<S where S: MyProtocol, S: MySuperClass>(param: S) in ... }

您期望什么类型myClosure成为?泛型创建抽象类型。在专门化之前,它不会成为真正的类型。所以myClosure本身就是一个抽象类型。这就像请求一个抽象类的实例。 “抽象”的全部意义在于你无法构建一个。你能说的最好的就是myClosure本身就是一种类型,您需要将其实例化为真实实例(但随后let没有任何意义;你不let types).

当你把它包裹在一个struct,您真正要做的是创建一个抽象类型,在创建实例时将其专门化为实际类型。

现在,在我看来,有意义的(但目前看来不可能)是这样的:

typealias Mapping<S> = S -> S
let identity: Mapping<Int> = { return $0 }

这是有道理的,因为您正在定义一个抽象类型(Mapping),然后实例化一个具体类型Mapping<Int>。很遗憾,typealias目前似乎不支持泛型,所以struct可能是我们拥有的最好的工具。


请注意,虽然typealias是一个半身像,显然可以专门化函数变量本身。我知道,这不是一个闭包,但在某些相同的情况下可能很有用。

func Identity<T>(i:T) -> T {
  return i
}

let identityInt:(Int -> Int) = Identity
identityInt(1) // => 1

使用它来进一步探讨抽象类型的问题,请考虑:

func Identity<T>(i:T) -> T { return i }
let x = Identity

这无法编译并出现错误:

error: cannot convert the expression's type '(T) -> T' to type '(T) -> T'

那是因为类型(T) -> T不是一种具体类型,所以你不能叫它x。比较一下identityInt,我明确地将其专门化为具体类型,然后可以构造。

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

使用泛型参数关闭 的相关文章

  • 在 Swift 中删除字符串中第一个字符的最简洁方法是什么?

    我想删除字符串中的第一个字符 到目前为止 我想到的最简洁的事情是 display text display text substringFromIndex advance display text startIndex 1 我知道我们不能用
  • 使用 Swift 在 iOS 和 Android 之间共享核心代码

    我想要的是 使用 Swift 在 Android 和 iOS 之间共享非 UI 代码 问题 Android 具有 NDK 支持 允许您使用 Java 本机接口 JNI 运行 C 和 C 代码 不是 Objective C 我是一名Java程
  • Swift - 如何使用 malloc?

    我正在尝试将 Objective C 应用程序转换为 Swift 但我不知道如何实现 malloc 可以在 Swift 中使用吗 谢谢 当您使用 Swift 中的 ObjC 或 C 时 您需要实现桥接标头 然后 桥接标头导出的函数可在 Sw
  • 如何缩放 CAShapeLayer

    我很快就成功制作了动画bezier path它包含在一个CAShapeLayer 我唯一的问题是将其实现到其他屏幕尺寸上 有谁知道我如何扩展CAShapeLayer里面有路径吗 即使其变为原始大小的一半 使用这个函数 var shapela
  • Firebase获取孩子ID swift ios

    我的 Firebase 看起来像这样 贝娄Active Orders看来childs根据他们的不同有不同的名字UID 用户身份 这是我的代码 用于获取孩子的 ID 无论孩子的名字是什么 但它似乎根本不起作用 获得的正确方法是什么child
  • 使用Combine,如何在网络请求后取消分配订阅

    如果您使用组合来处理网络请求URLSession 那么你需要保存Subscription 又名 AnyCancellable 否则它会立即释放 从而取消网络请求 稍后 当网络响应被处理后 您想要取消分配订阅 因为保留它会浪费内存 下面是执行
  • 在 Swift 中使用 NSCoding 归档可选结构数组?

    我已经在 Obj C 中完成了大量 NSCoding 归档 但我不确定它如何处理 Swift 中的结构 也不确定它如何处理具有可选值的数组 这是我的代码 public struct SquareCoords var x Int y Int
  • 如何使用 AVCaptureVideoPreviewLayer 从相机应用程序实现 2 倍变焦

    我的应用程序中有一个 AVCaptureVideoPreviewLaye 它运行良好 并且显示与相机应用程序相同的预览视频 我想实现相机应用程序的 2 倍变焦功能 我该怎么做呢 基本上 我希望我的预览层将视频源更改为与您在点击 1x 图标将
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa
  • didDeselectRowAtIndexPath indexPath 为 nil

    我有一个表视图控制器 它实现了 TableView 委托方法 public override func tableView tableView UITableView didSelectRowAtIndexPath indexPath NS
  • iOS 9.3.2 破坏 MPMusicPlayerController

    我正在尝试将 Apple Music 集成到我的应用程序中 直到今天早上我才设法使其完美运行 更新到 iOS 9 3 2 后 一切都不一样了 权限系统的工作原理相同 SK云服务控制器 https developer apple com li
  • swift 中 pch 的替代品是什么?

    我想知道可以用什么来代替 swift 中的 pch 有没有 pch 的替代方案或方法可以快速摆脱导入 这样我们就不需要对所有类都这样做 我不想一直随身携带 进口 swift 中 pch 的最佳替代品是什么 您无法在 swift 中定义 宏
  • 为什么 CABasicAnimation 尝试初始化我的自定义 CALayer 的另一个实例?

    我收到此错误 致命错误 对类 MyProject AccordionLayer 使用未实现的初始化程序 init layer 使用以下代码 在我的视图控制器中 override func viewDidLoad let view self
  • 在 swift ios 中播放远程 mp3 文件需要花费大量时间

    我有麻烦了 我想在我的应用程序中播放远程 mp3 文件 但 mp3 文件需要很长时间 大约 5 6 分钟 来播放 为什么 任何人都可以建议我应该做什么 import UIKit import AVFoundation class TestV
  • 在 Pages 文稿中打开文本—Swift

    在我的 Swift 2 应用程序中 用户通过文本字段创建一串文本 然后将其共享给另一个应用程序 现在 我只能将文本共享为 txt 文件 这不提供选项Open In Pages当我打开系统共享对话框时 如何才能让用户可以选择将输入的文本作为
  • Swift try inside Objective-C 块

    我需要创建一个函数foo它接受一个抛出闭包作为参数 我可以使用 Swift 或 ObjC 来实现它 但我需要能够从两者中调用它 像这样 Swift func bar throws func foo block throws gt void
  • supportedInterfaceOrientations 方法不会重写其超类中的任何方法

    在 UIViewController 中 这段代码 public override func supportedInterfaceOrientations gt UIInterfaceOrientationMask if let mainC
  • iOS 确定视频中的帧数

    如果我有一个 Swift 中的 MPMoviePlayerController MPMoviePlayerController mp MPMoviePlayerController contentURL url 有没有办法获取视频中的帧数u
  • Swift:Tableview 在导航栏下方滚动但在状态栏上方滚动?

    我使用以下技巧隐藏了导航栏的阴影 self navigationController navigationBar setBackgroundImage UIImage for default self navigationControlle
  • Swift - 保存在 TableView 中选择的复选标记

    我对 Swift 相当陌生 并且在 TableView 多重选择方面遇到问题 我有多个选择 可以用复选标记进行检查 类似于待办事项列表 当我检查项目时 我希望能够返回 ListView 并保存我的选择 我假设将其保持在已保存状态的代码将位于

随机推荐