【问题标题】:How to loop through class children of a struct?如何遍历结构的类子级?
【发布时间】:2016-03-29 07:10:00
【问题描述】:
struct List {
    class Item1: Holdable, Throwable {
        var property1 = "A"
        var property2 = "B"
    }

    class Item2: Holdable {
        var property2 = "A"
        var property3 = "B"
    }

    class Item3: Throwable, Catchable {
        var property4 = "A"
        var property5 = "B"
    }
}

我有一个这样的列表。我可以通过

一个一个地调用这些项目
List.Item1()

但如果我想要所有的 Holdable 物品,我怎样才能得到它们?

【问题讨论】:

  • 我试过 Mirror,但这似乎不起作用。
  • @demirb 将您的结构视为一个名称空间,您可以在其中声明一些类。您的结构根本没有属性。 List.Item1 只给你编译器错误。 let i1Type = List.Item1.self 给你一个 List.Item1.Type,让 i1 = List.Item1() 给你一个该类型的实例。就是这样……
  • 我在“List.Item1”的末尾添加了一个“()”。只是错过了。但事实并非如此。我已经能够一一访问这些项目。但我想循环浏览 100 多个项目。我能想出的唯一解决方案是将所有这些类放在不同类型的数组中并调用这些数组,这是很多额外的工作。如果只有一种方法可以将其变成可访问的对象,那就太好了。
  • @demibr 据我所知,没有其他运行时方法可以做到这一点,抱歉......如果不创建您的结构,它只存在于您的源文件中。即使您创建了它,它也没有任何属性,并且您的类声明也只存在于您的源文件中。
  • 我通过创建一个单独的变量并添加每个类来解决这个问题。现在我可以轻松地使用地图/过滤器了。虽然,当我需要添加一个新的类 obj 时,我必须将它添加到 2 个不同的位置:/

标签: swift2


【解决方案1】:

看看这个“自我解释”的例子

struct S {
    class A{}
    class B{}
    struct C{}
}

let a = S.A.self    // S.A.Type
let b = S.B()       // instance of S.B class
let c = S.C()       // instance of S.C struct
let s = S()         // instance of struct S without any property

这根本不应该编译

let a = S.A // error!!
let b = S.B // error!!

【讨论】:

  • 我不明白这是如何回答这个问题的。
  • @trojanfoe 请参阅我在 OP 问题下方的注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2021-07-18
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
相关资源
最近更新 更多