栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

快速表达动态范围的循环

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速表达动态范围的循环

使用辅助函数(最初在将使用除法的C样式for循环转换为Swift3时定义

public func sequence<T>(first: T, while condition: @escaping (T)-> Bool, next: @escaping (T) -> T) -> UnfoldSequence<T, T> {    let nextState = { (state: inout T) -> T? in        // Return `nil` if condition is no longer satisfied:        guard condition(state) else { return nil }        // Update current value _after_ returning from this call:        defer { state = next(state) }        // Return current value:        return state    }    return sequence(state: first, next: nextState)}

您可以将循环写为

let num = 1000for i in sequence(first: 5, while: { num/$0 > 0 }, next: { $0 * 5 }) {    print(i)}

一个更简单的解决方案是while循环:

var i = 5while num/i > 0 {    print(i)    i *= 5}

但是第一种解决方案的优点是,循环变量的范围仅限于循环主体,并且循环变量是常量。

Swift 3.1 将提供一个

prefix(while:)
sequence的方法,然后不再需要helper函数:

let num = 1000for i in sequence(first: 5, next: { $0 * 5 }).prefix(while: { num/$0 > 0 }) {    print(i)}

以上所有解决方案均与给定的C循环“等效”。 但是, 如果它们

num
接近
Int.max
$0 * 5
溢出
它们都可能崩溃。如果这是一个问题,那么在进行乘法运算 之前, 您必须检查是否
$0 * 5
适合整数范围。 __

实际上,这使循环更简单–至少如果我们假设

num >= 5
这样,则循环至少执行一次:

for i in sequence(first: 5, next: { $0 <= num/5  ? $0 * 5 : nil }) {    print(i)}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/613943.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号