Swift:如何将 for-in 循环与可选参数一起使用?

Posted

技术标签:

【中文标题】Swift:如何将 for-in 循环与可选参数一起使用?【英文标题】:Swift: How to use for-in loop with an optional? 【发布时间】:2015-12-17 10:37:36 【问题描述】:

将 for-in 循环与可选项一起使用的正确方法是什么?

现在我总是在循环之前执行一个可选绑定。还有其他成语吗?

let optionalInt:[Int]? = [1, 2, 3]

if let optionalInt = optionalInt 
  for i in optionalInt 
    print(i)
  

【问题讨论】:

【参考方案1】:

如果要对数组的所有元素应用一组操作,可以用forEach闭包替换for循环并使用optional chaining:

var arr: [Int]? = [1, 2, 3]
arr?.forEachprint($0)

【讨论】:

不,这不是唯一的答案。但是,它是最短的。 请注意,您不能在 forEach 上中断。 请注意,如果循环是对象初始化逻辑的一部分,则不能执行 forEach,因为在 self 初始化之前,闭包无法捕获 self。 这也增加了不必要的内存和性能占用 内存和性能占用即使不相似也相同。如果您想减少内存占用,请考虑在 for 循环中使用 autoreleasepool:developer.apple.com/library/archive/documentation/Cocoa/…【参考方案2】:

我认为没有合适的方法。有很多不同的方法,这真的取决于你喜欢什么,Swift 充满了可以根据你的选择让你的程序看起来非常漂亮的功能。

以下是我能想到的一些方法:

let optionalInt:[Int]? = [1, 2, 3]

for i in optionalInt!  print(i) 

for i in optionalInt ?? []  print(i) 

for i in optionalInt as [Int]!   print(i) 

【讨论】:

【参考方案3】:

你可以这样写:

let optionalInt:[Int]? = [1, 2, 3]
for i in optionalInt ?? [Int]() 
    print(i)

但我建议你避免使用可选值,例如你可以这样写:

var values = [Int]()
// now you may set or may not set 
for i in values 
    print(i)

或者如果你想使用可选值并且函数中的这段代码调用可以使用guard

guard let values = optionalInt else  return 
for i in values 
    print(i)

【讨论】:

【参考方案4】:

最干净的解决方案有时是最基本的解决方案

if let a = myOptionalArray 
    for i in a 
        
    

所以我建议,保持你的方法

上面的方法只插入一个空选项,或者forEach创建一个块只是因为if let a = optional 不够性感

【讨论】:

【参考方案5】:

我迟到了两年,但我认为这是最好的方法。

func maybe<T>(risk: T?, backup: T) -> T 
  return risk.maybe(backup)

extension Optional 
   func maybe(_ backup: Wrapped) -> Wrapped 
     switch self 
     case let .some(val):
        return val
     case .none:
        return backup
     
   

现在

for i in optionalInt.maybe([]) 
    print(i)

【讨论】:

哈哈? `for i in optionalInt ?? [] print(i) ' 哈!用佳能杀死蚊子 wau,我有时只是想,objective-c nil 行为有什么问题?我们又回到了如何循环简单数组而不是编写样板文件......啊我忘了,swift设计师只需要与众不同哈哈 有多少人挠了挠头才意识到这是个玩笑?

以上是关于Swift:如何将 for-in 循环与可选参数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

For-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速

Swift编程语言中如何实现自定义类型的for-in循环(基于Swift 2.2)

如何跳过for-in循环的迭代(Swift 3)

Swift学习笔记之----元组与可选值类型

Swift学习笔记之----元组与可选值类型

函数重载与可选参数