加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如果在Swift中可选的向下转换失败,你能继续循环吗?

发布时间:2020-12-14 02:26:01 所属栏目:百科 来源:网络整理
导读:如果元素上的某些条件失败,那么继续循环是一种非常常见的习惯用法. 假设我们想对某种类型的所有子视图做一些事情(并且出于某种原因,不想躲避类型的事情).理想情况下,我们会写: for view in self.subviews as [NSView] { // cast required in beta 6 if (let
如果元素上的某些条件失败,那么继续循环是一种非常常见的习惯用法.

假设我们想对某种类型的所有子视图做一些事情(并且出于某种原因,不想躲避类型的事情).理想情况下,我们会写:

for view in self.subviews as [NSView] { // cast required in beta 6
    if (let specificView = view as? SpecificView) == nil { // <- Error here
        continue
    }

    // Do things at a sensible indentation level
}

上面的代码失败,“模式变量绑定不能出现在表达式中”,如this question所示.

但是,这似乎是一种常见的模式,必须有一种方法可以在Swift中实现.我错过了什么吗?

编辑:现在我考虑一下,这似乎违反了if语句的范围规则,它只将变量范围限定在内部块中.

考虑到这一点,我想稍微扩大一下这个问题:人们如何在Swift中普遍应用这种模式?

这是一种有点常见的模式,但它不是一个好的模式.我已经看到它向ObjC项目注入了错误.它假设视图层次结构过多,并且当变化时变得脆弱(例如当有人注入额外的视图时,你不期望为了管理旋转;真实的故事).更好的模式是维护一个指向您要跟踪的SpecificView(或视图)的属性.一般来说,向下倾斜是需要避免的,而不是优化的.

也就是说,这不是一种可怕的模式,有时它是一种非常有用的模式.那你怎么处理呢?

let specifics = self.subviews
  .filter { $0 is SpecificView }
  .map { $0 as SpecificView }

for view in specifics { ... }

这是一种常见的模式,所以也许我们可以对它进行泛化?

extension Array {
  func filterByClass<T>(c: T.Type) -> [T] {
    return self.filter { $0 is T }.map { $0 as T }
  }
}

for view in self.subviews.filterByClass(SpecificView) { ... }

也就是说,我认为应该尽可能避免这种方法,而不是过分简化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读