Swift 'AnyObject' does not have a member n

2019-08-19 06:52发布

问题:

I am confused on how I can have two keys as strings and one works and the other doesn't. Error occurs in the line near the end:

println("Here's a (car.year) (car.make) (car.model)")

What is it about the "make" variable that could be causing the problem?

protocol NSCoding {

}

class Car:NSObject {

    var year: Int = 0
    var make: String = ""
    var model: String = ""

    override init() {
        super.init()
    }

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeInteger(year, forKey:"year")
        aCoder.encodeObject(make, forKey:"make")
        aCoder.encodeObject(model, forKey:"model")
    }

    init(coder aDecoder: NSCoder!) {

        super.init()

        year = aDecoder.decodeIntegerForKey("year")
        make = aDecoder.decodeObjectForKey("make") as String
        model = aDecoder.decodeObjectForKey("model") as String

    }
}

class CarData {


    func archiveData () {
        var documentDirectories:NSArray
        var documentDirectory:String
        var path:String
        var unarchivedCars:NSArray
        var allCars:NSArray

        // Create a filepath for archiving.
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

        // Get document directory from that list
        documentDirectory = documentDirectories.objectAtIndex(0) as String

        // append with the .archive file name
        path = documentDirectory.stringByAppendingPathComponent("swift_archiver_demo.archive")

        var car1:Car! = Car()
        var car2:Car! = Car()
        var car3:Car! = Car()

        car1.year = 1957
        car1.make = "Chevrolet"
        car1.model = "Bel Air"

        car2.year = 1964
        car2.make = "Dodge"
        car2.model = "Polara"

        car3.year = 1972
        car3.make = "Plymouth"
        car3.model = "Fury"

        allCars = [car1, car2, car3]

        // The 'archiveRootObject:toFile' returns a bool indicating
        // whether or not the operation was successful. We can use that to log a message.
        if NSKeyedArchiver.archiveRootObject(allCars, toFile: path) {
            println("Success writing to file!")
        } else {
            println("Unable to write to file!")
        }

        // Now lets unarchive the data and put it into a different array to verify
        // that this all works. Unarchive the objects and put them in a new array
        unarchivedCars = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as NSArray

        // Output the new array
        for car : AnyObject in unarchivedCars {
            println("Here's a \(car.year) \(car.make) \(car.model)")
        }
    }

}

回答1:

Use downcasting in your for loop. The compiler needs to know that car is of type Car and not just AnyObject.

for car in cars as [Car!] {
    println("Here's a \(car.year) \(car.make) \(car.model)")
}