编译器无法推断返回类型

2024-04-04

Swift 无法推断函数的返回类型,该函数的参数是闭包,并且返回类型是从闭包的返回类型推导出来的。

给定这个通用类:

class Bar<T> {
    init(_ v:T) {}

    func wrap<R>(f:()->R) -> Bar<R> {
        return Bar<R>(f())
    }
    func wrap(f:()->()) -> () {
        f()
    }
}

功能wrap被重载,一旦将 Closure 作为返回的参数(),还有一次采用闭包作为参数,该参数返回指定为类型参数的类型(R) 为函数。

在下面的代码片段中,很明显闭包的返回类型作为参数传递给函数wrap is a String:

var bar :Bar<Int> = Bar<Int>(0)

let b0 = bar.wrap {
    return ""
}

恕我直言,编译器现在应该能够推断出返回类型wrap作为类型Bar<String>,因此应该能够推断出常量的类型b0因此。

编译器(从 beta 3 开始)会发出以下错误:

main.swift:53:16: error: type '()' does not conform to protocol 'StringLiteralConvertible'
    return ""
           ^
main.swift:51:9: warning: constant 'b0' inferred to have type '()', which may be unexpected
let b0 = bar.wrap {
    ^
main.swift:51:9: note: add an explicit type annotation to silence this warning
let b0 = bar.wrap {
    ^
      : ()

这两种解决方法都可以解决该问题:

let b1 = bar.wrap {
    () -> String in
    return ""
}
let b2:Bar<String> = bar.wrap {
    return ""
}

Edit:添加了安东尼奥的答案作为另一个可以正确编译的版本:

let b0 = bar.wrap { "" }

问题是:

假设编译器按指定方式工作,是否有令人信服的原因导致编译器无法推断失败示例中的返回类型?

再次,请考虑这一点:

works: let b0 = bar.wrap { 0 }
fails: let b0 = bar.wrap { return 0 }

或者,这可能是 beta 状态编译器的不完整或不正确实现的影响吗?

注意:请不要在这里发表您的意见,仅发表明确的事实 - 如果有的话。 ;)


也许您正在寻找的是单个表达式闭包的隐式返回:

let b0 = bar.wrap { "" }

Addendum

对于一种方法有效而另一种方法无效可能有很多话要说。 这本书没有提到任何捷径,只使用return和一个值。但这在显式泛型类型时有效

let b2:Bar<String> = bar.wrap { return "" }

另一方面,在从上下文推断类型 https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-XID_114Swift 书中的一段,在谈论类型推断时没有提到泛型,所以如果在这种情况下类型推断与泛型类型结合使用时不起作用,我不会感到惊讶。

持续看书:

该参数需要一个类型为 (String, String) -> Bool 的函数。这意味着 String、String 和 Bool 类型不需要编写为闭包表达式定义的一部分

这并不意味着(但可能)这不起作用:

() -> (T)

where T是一个泛型类型。

也就是说,我认为

let b0 = bar.wrap { return "" }

不起作用,因为方程中涉及泛型类型。以下是我的看法,但无论如何你都应该阅读它。有可能是这样的:

let b0 = bar.wrap { "" }

有效,但不应该。这意味着它可以工作,但它是一个错误,它应该会产生编译器错误。这有任何意义吗?

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

编译器无法推断返回类型 的相关文章

  • 为什么我需要在 Swift 中为结构编写初始化程序才能在单元测试中使用它?

    我正在尝试使用公共结构 public struct Person public let name String 在单元测试 XCTest 中 let person Person name Paul 测试构建失败并出现错误 无法构造 Pers
  • 更改accessoryType Swift 的颜色

    我想将我的手机配件类型的颜色从蓝色更改为白色 textColor 已设置为白色 你们有人知道该怎么做吗 My Code cell accessoryType UITableViewCellAccessoryType Checkmark 您可
  • Swift 中获取 UIPanGestureRecognizer 的起点和终点

    我在用着UIPanGestureRecognizer在一个项目上 我想取起点和终点 我试着做touchesBegin 但没有得到满足我需要的代码 如何获取起点和终点UIPanGestureRecognizer 对于您的情况 您可能希望将我的
  • 如何在另一个泛型基类上添加 C# 泛型类型约束?

    我已经多次阅读有关 C 泛型类型参数约束的 MSDN 文档 但我无法弄清楚如何做到这一点 或者确定它是否可能 假设我有一个像这样的通用基类 public abstract class Entity
  • Apple Watch 表 - 前 4 行未出现

    我在添加行时遇到问题WKInterfaceTable在苹果手表上 奇怪的是 无论我做什么 前 4 行都显示为空 我尝试手动添加行并循环 没关系 我相信我的代码很好 因为第五行和其他行看起来都很好 发生的情况如下 进一步滚动 My code
  • 无需 nib 以编程方式实例化 UIViewController

    我想创建一个UIViewController以编程方式进行 无需使用笔尖或故事板 我认为实施该计划就足够了UIViewController as class TestViewController UIViewController overr
  • Swift3 中的数组排序

    在我的代码中 我有一个如下所示的结构 struct Object var name String var count Int 我现在正在创建一个包含 10 个对象的数组 这些对象具有随机名称和随机计数 有没有一个简单的方法a 按字母顺序对它
  • 将应用程序发送到后台并从 XCTest 中的最近应用程序重新启动它

    我正在寻找问题的解决方案 其中我需要将我的应用程序发送到后台并在特定时间间隔后从最近的应用程序重新启动它 在 Instruments UIAutomation 中使用 deactivateAppForDuration 来实现此目的 有谁知道
  • 在不使用PrepareForSegue的情况下在segue之间传递数据

    我正在使用情节提要创建一个用户设置帐户 分 5 个步骤 每个步骤都有一个 ViewController 1 输入姓名 联系人等 2 导入照片 3 输入等 4 更多输入 5 确认页面 如果用户单击 确认 gt 获取所有输入并上传到解析 当我在
  • 使用 Swift 创建随机 CGPoint

    所以 我正在尝试开发一个用 Swift 编写的简单游戏 但我在做一件非常简单的事情时遇到了困难 我无法创建随机 CGPoint 使用 arc4random 时 会出现编译器错误 告诉我无法在 CGPoint 中使用 Int32 那么 有什么
  • Swift 闭包异步执行顺序

    在我的模型中 有函数来获取需要完成处理程序作为参数的数据 func fetchMostRecent completion sortedSections TableItem gt self addressBook loadContacts c
  • 快速转换:错误 - CGPathAddArc

    我正在尝试将我的 Swift 2 代码转换为最新语法 Swift 3 我收到以下错误 Nil 与预期的参数类型 UnsafePointer 不兼容 斯威夫特2代码 CGPathAddArc 路径 nil overlayView frame
  • 在堆栈视图内的 Uilabel 之间创建垂直线 [重复]

    这个问题在这里已经有答案了 我想在代码中创建一个带有自定义标头的 UICollectionView 因此 我创建了 UICollectionViewCell 的子类来描述我的自定义标头 我想在标题中以水平线显示五个标签 因此 我创建了五个标
  • 如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新?

    In my UICollectionView 我使用一个简单的自定义对象数组来生成和显示单元格 有时数据会发生变化 我想一次性为所有变化添加动画效果 我选择通过跟踪第二个数组中的所有更改 比较两个数组并在一个数组内生成一组移动 插入 删除和
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下
  • iOS 应用程序中的谷歌地图实时交通状况?

    如何使用 google 地图 sdk 或 api 在 ios 应用程序中添加当前交通状况 如下图所示 有 javascript api 但我没有找到任何适用于 iOS 应用程序的解决方案 只需在 iOS SDK 中添加一行代码即可启用或禁用
  • 从呈现的视图控制器访问呈现的视图控制器?

    我有一个视图控制器 包含我的菜单 显示在另一个视图控制器 我的应用程序 之上 我需要从呈现的视图控制器 我的菜单 访问呈现的视图控制器 在我的菜单下方 例如访问某些变量或使呈现的视图控制器执行其segues之一 但是 我就是不知道该怎么做
  • 在 Alamofire 中快速发送 GET 请求中的 json 对象

    我正在尝试执行一个绑定了 json 对象的 GET 请求 这就是我生成 JSON 对象的方式 let jsonObject String AnyObject ean code type match value 16743799 然后我执行了
  • 无法将类型“(User?, Error?) -> ()”的值转换为预期参数类型“AuthDataResultCallback?”

    当我更新 firebase pod 时出现此错误 无法将类型 User Error gt 的值转换为预期参数类型 AuthDataResultCallback 又名 可选 gt static func signUp username Str
  • ADO EF Code First 通用中间类继承映射

    我有以下要求 该要求在 OO 空间中运行良好 但我似乎无法首先使用 ADO EF 代码将其映射回数据库 我有许多产品 每个产品都有不同的方面 属性 但不是代码属性意义上的 例如 戒指将具有矿物类型 金等方面 而钻石将具有净度方面 VVSI1

随机推荐

  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • Virtualenv 和 Anaconda 问题

    所以这个问题之前已经提出过 但我还没有找到合适的解决方案 我在Mac上 当我在终端中运行 python 时 我得到 Python 2 7 6 Anaconda 1 9 2 x86 64 default Jan 10 2014 11 23 1
  • 为什么建议在源文件末尾有空行?

    一些代码风格工具推荐这样做 我记得看到一些 unix 命令行工具警告缺少空行 多出一个空行的原因是什么 如果文本文件中的最后一行数据不是以换行符或回车符 换行符组合终止 许多旧工具会出现错误行为 他们忽略该行 因为它以 Z eof 结尾
  • python 字典难题

    在控制台上我输入 gt gt gt class S str pass gt gt gt a hello gt gt gt b S hello gt gt gt d a a b b gt gt gt d hello hello gt gt g
  • 如何创建反转的png图像?

    我正在创建绘制在我的底座上的png图像 从底座我可以保存一个png图像 供您参考 Graphics g e Graphics g DrawLine pen new Point x y new Point x1 y1 base OnPaint
  • Python 有与 java.lang.Math.nextUp 等效的东西吗? [复制]

    这个问题在这里已经有答案了 我有一个Pythonfloat 我想要floats 为 1ULP http en wikipedia org wiki Unit in the last place更大和更小 在Java中 我会这样做Math n
  • 在 CSS 中指定打印的细线粗细

    如果我有一个打印 CSS 样式元素 border 1px solid black or border 0 25pt solid black 打印时线条很粗 至少 1 磅 如果我尝试更小的值 例如 0 05pt 则该线根本不会出现 我怎样才能
  • 同名的变量和常量

    我有一个C代码片段如下 const int x 5 void main int x x int y sizeof x sizeof int printf d y 代码片段将被编译并正确运行 但我不明白如何区分 x variable 和 x
  • 什么是 git-cache 以及 git-cache 中存储了什么

    事实上 我读了很多关于 git 的东西 我知道我可以通过删除缓存git rm cached 命令但我无法理解这个概念git 缓存 什么是缓存 而GIT中的缓存位置又在哪里呢 该缓存是存储在 RAM 中还是文件中 git 中使用缓存来提高性能
  • Android Studio 中的多个本机模块

    我有一个当前在 Visual Studio 中设置的 C 代码库 在 Windows 上运行 其中包含多个具有相互依赖关系的项目 我正在尝试将其转移到 Android Studio 以使其在 Android 上运行 我熟悉 Visual S
  • Facebook Unity SDK,如何强制使用webview而不是FB App登录

    默认情况下 如果用户安装了 FB Unity SDK 它将尝试使用 FB App 进行登录 否则 它将回退到使用基于 HTML 的弹出窗口来让用户登录 然而 FB 应用程序仅适用于 API 1 0 basic info 权限 将因 publ
  • 第 8 章 Rails 教程记住令牌错误

    本章介绍添加记住令牌 以确保记住用户登录状态 并且仅当用户明确注销时才清除会话 我了解在我的应用程序中拥有此功能的重要性 因此希望确保它正常工作 但是 当我运行时 我遇到了很多错误 bundle exec rspec spec 我怀疑它们与
  • 从 SQL 表中的行中删除尾随“:”字符

    我有数百万行的表 每行都有一个 nvarchar max 列 当我填充数据库时 我忘记删除结尾的 字符 遍历每一行并删除最后一个字符的最快 最有效的方法是什么 我认为必须有一种比使用看起来昂贵的 REPLACE 更快的方法来做到这一点 这是
  • 我们可以在 Android 中的短信到达收件箱之前将其删除吗?

    我正在从收件箱中删除一条短信 但我想知道 如何在它到达收件箱之前将其删除 Yes 尽管对这个问题有一些负面反应 但短信拦截有合法的用途 例如 自动电话号码验证 通过短信提供的服务 尽管通常这应该通过数据短信来完成 或者通过处理特殊格式的消息
  • Hexfloat机械手和精度

    如何使用输出hexfloat操纵器忽略任何精度ostream include
  • 如何在 Windows 中从 Google Code 下载/签出项目?

    当没有准备好的可用下载时 如何从 Google Code 下载整个项目的 ZIP 文件 这是我在结帐页面上看到的 命令行访问使用此命令可以匿名查看最新的项目源码 svn checkout http myproject googlecode
  • 向将数组作为字段之一的 Hive 表插入行时出现错误 10293

    我使用以下查询创建了一个配置单元表 create table arraytbl id string model string cost int colors array
  • ASP.NET 版本列表?

    感谢 stackoverflow 上的问答 我刚刚发现如何确定托管提供商服务器上安装的版本 现在我需要知道这个数字意味着什么 Using 在我的本地计算机上返回 2 0 50727 3053 有人能给我一份实际版本 1 1 1 2 等的列表
  • Maven多模块和Spring微服务的区别?

    我正在阅读下一个项目的 Spring 微服务 Tut 说 这种架构风格将主应用程序划分为一组称为微服务的子应用程序 一个大型应用程序划分为多个协作进程 所以我们已经有了一个框架 Maven 多模块 根据我的经验 我将项目分开了 尽管确实如此
  • 编译器无法推断返回类型

    Swift 无法推断函数的返回类型 该函数的参数是闭包 并且返回类型是从闭包的返回类型推导出来的 给定这个通用类 class Bar