为什么以下快速代码会出错?

时间:2015-02-25 16:51:20

标签: ios swift swift-playground

数组不附加自定义类对象

// Create an array with String and Double
var shoppingList = ["Eggs", 2.0]

// Append array with string object
shoppingList += ["Milk"]

// Declare an example class 
    class Foo  {
        var name : String?
        func Foo() {
            name = "Default Name"
        }
}


var foo : Foo = Foo()
shoppingList += [foo] // Error : '[NSObject]' is not identical to 'Uint8'

为什么shoppingList不会附加foo对象?

2 个答案:

答案 0 :(得分:1)

Swift错误消息通常非常神秘。我不确定Uint8到底是什么。

Swift数组只包含一种类型。在这种情况下,您的shoppingList被推断为[NSObject]类型,因为Swift能够将"Eggs"NSString2.0联系起来NSNumber }。 NSStringNSNumber都是NSObject的子类,因此Swift会将您的数组推断为[NSObject]类型。

如果您想将Foo()放入该数组,那么Foo也需要是NSObject的子类:

class Foo: NSObject { ...

答案 1 :(得分:1)

除了@ vacawama的解决方案之外,您可以显式指定数组元素类型,而不是让类型推断为您设置它:

var shoppingList: [AnyObject] = ["Eggs", 2.0]

将值类型设置为AnyObject的明显优势在于您不必使自定义类继承自NSObject