Swift闭包中的“表达式类型不含更多上下文”错误

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

type of expression is ambiguous without more context.

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

这是重现它的代码.

我有2个结构:

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

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

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

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_))})

不仅在镜头类型中指定了第一个闭包的参数类型,而且在闭包本身中也是如此.

这是怎么回事????

解决方法

虽然它表明错误提取中,但它确实在创建中. 0美元和1美元是倒退的.你指的是$0.name_,但创建闭包的$0是B,地址,但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_)) }
)

或者您可以重新定义镜头:

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

然后你可以这样做:

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

或者,也许你的意思是:

let lens : Lens<Person,address_: $1) }
)

这样,创建使用所提供地址的街道和城市. (使用地址的街道对我来说没有意义,但不是城市.)

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...