Swift进化建议SE-0094在Swift
3.0中实现,引入了全局sequence
功能:
sequence(first:next:)
sequence(state:next:)
后者声明如下
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...3
,let seq2 = 4...6
),但是出现了非常奇怪的错误消息提示
错误:对成员’
sequence(first:next:)
‘的引用不明确
仅当我State
在next
闭包中显式键入注释可变参数及其返回类型时,以上示例才会编译
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的评论中所证实的那样:
这是正确的行为:Swift不会从多语句闭包的主体中推断参数或返回类型。但是诊断可能会好得多。
因此,从理论上讲,您只需要显式定义传递给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中进行编译)
但是,这仍然无法编译-这是由于第二个问题,在第二个问题中,编译器无法推断inout
Swift 3中闭包参数的类型(在Swift
2中不是这种情况)。这是一个可疑的错误,已经提交(请参见SR-1976和SR-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()
})
问题内容: 这是对问题的跟进:协议func返回Self。协议如下: 以下工作正常,但每个实现的功能完全相同,即 按照这个http://nshipster.com/swift-default-protocol- implementations/ 我尝试了一个全局功能 但是,在实现以下协议的类中调用它时 我得到指出的错误。当我键入自动完成显示为,我不知道那是什么意思。我也尝试过添加,但显然只允许这样做
本文向大家介绍Pythonround()函数平局和返回类型,包括了Pythonround()函数平局和返回类型的使用技巧和注意事项,需要的朋友参考一下 示例 round() 在Python 2中,使用round()相等接近两个整数的数字将返回距离0最远的数字。例如: Python 2.x 2.7 然而,在 Python 3中,round ()将返回偶数(即银行的四舍五入)。例如: Python 3
全局函数 返回上级 DirectDrawCreate DirectDrawCreateClipper DirectDrawEnumerate DirectDrawEnumerateEx DirectDrawCreate 返回目录 创建一个DirectDraw对象的实例。 HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW
debug 调试打印PHP变量,并中断执行。等同于 var_dump($var1, $var2);die; table 将任意MySQL表构造成Model对象。 table($table_name, $db_object_id); model 创建模型对象。 model($model_name, $db_object_id);
Herosphp提供了一些全局辅助函数: //格式化打印变量(数据) __print($message); //终端高亮打印绿色(success) tprintOk($message); //终端高亮打印红色(error) tprintError($message); //终端高亮打印黄色(warning) tprintWarning($message); //计算字符串的hash值, 默
imigo 启动一个协程,自动创建和销毁上下文 imigo(function(){ $value = Redis::get('key'); // 无需手动释放任何资源 }); 传入参数: imigo(function($id, $name){ echo $id, ':', $name, PHP_EOL; // 1:test }, 1, 'test'); imiCalla