swift - Swift 闭包中的 "type of expression is ambiguous without more context"错误

标签 swift cocoa compiler-errors swift2

我的 Swift 代码中出现了一个奇怪的类型相关错误:

type of expression is ambiguous without more context.

即使我提供了完整的类型信息,也会发生这种情况。

这是重现它的代码。

我有两个结构:

struct Person{
    let name_ : String
    let address_ : Address
}

struct Address {
    let street_ : String
    let city_ : String
}

然后我创建一个包含 2 个函数的结构来获取和设置 Personaddress:

struct Lens<A,B> {
    let extract: (A)->B
    let create: (B,A) -> A
}

当我尝试创建一个获取和设置地址的 Lens 实例时(在后一种情况下,它返回一个具有新地址的新 Person),我在第一个闭包中遇到了错误。

let lens : Lens<Person, Address> =
Lens(
    extract: {(p:Person)->Address in
        return p.address_}, // here's the error
    create: {Person($0.name_,
        Address(street_: $1, city_: $0.address_.city_))})

不仅第一个闭包的参数类型在 lens 的类型中指定,而且在闭包本身中也指定。

这是怎么回事????

最佳答案

虽然它表明错误在 extract 中,但实际上是在 create 中。 $0$1 是倒过来的。您指的是 $0.name_,但是 create 闭包的 $0B地址,但是name_Person 的属性。我想你的意思是:

let lens : Lens<Person, Address> = Lens(
    extract: { $0.address_ },
    create: { Person(name_: $1.name_, address_: Address(street_: $0.street_, city_: $1.address_.city_)) }
)

或者你可以重新定义Lens:

struct Lens<A, B> {
    let extract: (A) -> B
    let create: (A, B) -> A   // note, A & B swapped
}

然后你可以做:

let lens : Lens<Person, Address> = Lens(
    extract: { $0.address_ },
    create: { Person(name_: $0.name_, address_: Address(street_: $1.street_, city_: $0.address_.city_)) }
)

或者,也许你的意思是:

let lens : Lens<Person, Address> = Lens(
    extract: { $0.address_ },
    create: { Person(name_: $0.name_, address_: $1) }
)

这样,create 使用提供地址的街道和城市。 (使用地址的街道而不是城市对我来说没有意义。)

关于swift - Swift 闭包中的 "type of expression is ambiguous without more context"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620589/

相关文章:

swift - 单文件优化与整个模块优化之间有什么区别

php - 在 Cocoa 中加密数据,在 PHP 中解码

java - 如何检测 Eclipse 编译错误(Java - JDT)

objective-c - 如果 Apple 建议不要对类型 ID 进行硬编码,如何识别 Core Foundation 对象?

c++ - 未解析的外部符号 - 构造函数

java - 字符串文字没有被双引号正确关闭

html - 如何使用 swift 解释 IOS 应用程序中的 HTML

ios - 一旦按下单独的 UIButton,禁用 UITableViewCell 中的所有 UIButton

SwiftUI : Error while using if#available while trying to build to iOS 13 and iOS 14 in Xcode 12 beta 2

cocoa - 子类化 NSArrayController 的原因是什么?