我的 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 个函数的结构来获取和设置 Person
的 address
:
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
闭包的 $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_)) }
)
或者你可以重新定义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/