什么是Swift类型?

时间:2016-09-04 08:32:28

标签: swift

我想将一个类型数组传递给函数 - 但我不确定什么是Swift类型。

我们说我有两节课: MyClass和AnotherClass。 我想要一个像这样的数组[MyClass,AnotherClass]。 阵列的类型是什么?

4 个答案:

答案 0 :(得分:1)

它是AnyClass类型,它是所有对象类型的基础。

func checkClassTypes(types: [AnyClass]) {
  types.forEach { type in
    // Your custom classes don't necessarily have to subclass from NSObject.
    print(type is NSObject.Type)
  }
}

checkClassTypes([MyClass.self, AnotherClass.self])

答案 1 :(得分:1)

如果您只需要包含类类型,.txt { padding: 12px 16px; color:blue; top:0; -webkit-box-shadow: -10px 0 10px -2px #ffffff; box-shadow: -10px 0 10px -2px #ffffff; } span:hover { -webkit-box-shadow: none; box-shadow: none; } 将起作用:

AnyClass

如果您想要包含某些值类型,则可能需要使用class MyClass { //... } class AnotherClass { //... } let classTypes: [AnyClass] = [MyClass.self, AnotherClass.self] Any

Any.Type

但是,let types: [Any] = [Int.self, String.self, MyClass.self, AnotherClass.self] let anyTypes: [Any.Type] = [Int.self, String.self, MyClass.self, AnotherClass.self] AnyClassAny这三种类型都难以使用。您很快就会发现在数组中实例化一个类非常困难。

答案 2 :(得分:0)

我不确定我是否正确理解了关于Swift类型的问题,但Swift没有将Type指定为某种变量。 Swift定义代码中的变量可以有某种类型,可以是浮点数,字符串,整数等。当说Swift类型安全并推断出类型时,这意味着Swift要求你清楚存储在变量中的值的类型(类型安全),并且当您指定值(类型推断)时,Swift将尝试推断变量的类型。

变量的类型也可能更复杂,如枚举,结构或类。 Swift甚至将数组或其他集合视为类型。在这个意义上,Type可以被定义为一块存储器,其中存储常量或变量(或这些的集合)。一种类型可以是不同的东西。将Type作为常量/变量存储信息的好处是,我现在可以将变量的类型推迟到运行时,而不是我必须在我的代码中指定它。或者我可以指定泛型类型的结构,稍后我可以定义具有相同结构但具有不同类型的不同类型的变量。请阅读有关处理Apple的Swift编程语言类型的更详细信息。它是免费的,可以在iBooks商店下载。

现在回到你的[MyClass,AnotherClass]数组的第二个问题,有点像将数组的类型推迟到以后。您最初可以将您的数组定义为AnyObjects或更像swift的AnyClass数组,例如

myArray = [AnyClass]()

稍后您可以在该数组中放置不同类型的变量/对象,如Double,String或具有特定类的对象。

但是,建立这样的数组时应该小心。此数组不是类型安全的,您还没有指定某个索引处的对象类型。为了防止xcode在您的代码和程序出现问题时崩溃,您应该始终在数组中输入各个对象。例如

if let myObject = myArray[2] as? myClass { do something }

如果您没有对阵列进行类型转换,那么xcode和您的程序都会做出奇怪的事情。

我希望这能回答你的问题。

亲切的问候, MacUserT

答案 3 :(得分:-1)

我猜你真的想要创建两个类的实例数组,而不是类定义的数组。如果是这样,您将创建一个AnyAnyObject而非AnyClass的数组。

class MyClass {
}

class OtherClass {
}

let m = MyClass()
let o = OtherClass()

let array1 = [m, o] as [Any]
// or
let array2 = [m, o] as [AnyObject]