gpt4 book ai didi

swift - 全局函数序列(状态 :next:) and type inference

转载 作者:行者123 更新时间:2023-11-28 08:23:25 24 4
gpt4 key购买 nike

背景和细节

Swift 进化提案 SE-0094在 Swift 3.0 中实现,引入全局 sequence 函数:

后者声明如下

func sequence<T, State>(state: State, 
next: @escaping (inout State) -> T?) ->
UnfoldSequence<T, State>

并在 swift/stdlib/public/core/UnfoldSequence.swift 中实现.语言引用给出了以下使用它的示例(注意缺少显式类型注释)

// Interleave two sequences that yield the same element type
sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()), next: { iters in
iters.0 = !iters.0
return iters.0 ? iters.1.next() : iters.2.next()
})

但是,我无法使上面的示例起作用(例如,使用 let seq1 = 1...3let seq2 = 4...6),但会提示相当奇怪的错误消息

error: ambiguous reference to member 'sequence(first:next:)'

只有当我在 next 闭包中明确键入注释可变的 State 参数及其返回类型时,上面的示例才会编译

let seq1 = 1...3
let seq2 = 4...6

for i in sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()),
next: { (iters: inout (Bool, ClosedRangeIterator<Int>, ClosedRangeIterator<Int>))
-> Int? in
iters.0 = !iters.0
return iters.0 ? iters.1.next() : iters.2.next()
}) {
print(i)
} // 1 4 2 5 3 6

这不是我希望使用 sequence(state:next:) 的方式,但是,因为我更愿意在类型推断正常工作的动态应用程序中看到它,避免所有的明确性。

问题

  • 我们是否打算使用带有显式类型注释的 sequence(first:next:) 函数?由于 inout 参数闭包,此函数是否存在某些限制,或者我是否遗漏了什么?

最佳答案

这看起来像是两个问题的结合。

首先,Swift 目前无法在没有任何外部上下文的情况下推断多行闭包的类型。然而,正如 Apple 开发人员 Jordan Rose 在 SR-1570 的评论中所证实的那样,这是有意为之的行为。 :

This is correct behavior: Swift does not infer parameter or return types from the bodies of multi-statement closures. But the diagnostic could be a lot better.

因此理论上,您只需要显式定义传递给 sequence()next: 参数的闭包的返回类型,作为参数类型可以从外部上下文中推断出来(即您传递给 state: 参数的类型):

let seq1 = 1...3
let seq2 = 4...6

let combined = sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()),
next: { iters -> Int? in
iters.0 = !iters.0
return iters.0 ? iters.1.next() : iters.2.next()
})

(编辑:现在可以在 Swift 3.1 中编译)


但是,这仍然无法编译——这是由于第二个问题,编译器无法推断 Swift 3 中 inout 闭包参数的类型(在 Swift 3 中不是这样) swift 2).这是一个疑似错误,已提交(参见 SR-1976SR-1811 )。

因此,正如您在问题中指出的那样,这意味着(非常不满意)您必须显式注释传递给 next: 的完整闭包签名:

let combined = sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()),
next: { (iters: inout (Bool, ClosedRangeIterator<Int>, ClosedRangeIterator<Int>)) -> Int? in
iters.0 = !iters.0
return iters.0 ? iters.1.next() : iters.2.next()
})

关于swift - 全局函数序列(状态 :next:) and type inference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40725535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com