iOS:一种在Swift中定义NSArray内部的常规对象的方法

时间:2015-02-11 10:59:52

标签: ios oop swift

在Swift中我有这个对象城市:

class City {

    var name:String
    init(name: String) {
        self.name = name
    }

    var file:String?
    var description:String?
}

现在在我的viewcontroller中我用这些类型的对象填充一个数组,我想填充一个tableview,但是我无法访问该对象的属性。

我向您展示了不带属性“file”的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell = menu_list.dequeueReusableCellWithIdentifier("list_cell") as ListCell
    cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator

    var obj = list_element.objectAtIndex(indexPath.row)

    var name = obj.file
    return cell
}

现在停止!您可以建议我添加“作为城市”

var obj = list_element.objectAtIndex(indexPath.row) as City

但是我不知道我的数组填充了什么类型的对象,我还有其他对象作为Country和State,那么对象的一般管理方式是什么?在obj-c中我用“id”做了但是在swift中?

1 个答案:

答案 0 :(得分:0)

在Swift中,如果您愿意,可以使用NSArray,只需要确保所有对象都是NSObject的子类。 Swift还允许您声明一个类型[Any]的数组,它可以包含任何类型。然后使用条件转换as?来处理对象:

class City {

}

class Country {

}

class State {

}

var places = [Any]()

places.append(City())
places.append(State())
places.append(Country())
places.append(Country())
places.append(13)

for place in places {
    if let loc = place as? City {
        println("processing city")
    }
    if let loc = place as? State {
        println("processing state")
    }
    if let loc = place as? Country {
        println("processing country")
    }
}

您还可以使用switch来确定类型:

for place in places {
    switch place {
    case let loc as City:
        println("I see a city")
    case let loc as State:
        println("I see a state")
    case let loc as Country:
        println("I see a country")
    default:
        println("I don't know what it is")
    }
}

如果您要将places City StateCountryLocation个对象放入其中,那么将这三个类派生自一个基类(我们称之为[Location]),然后让您的地点数组为{{1}}类型。