用前缀调用对象元素

时间:2016-04-11 15:29:16

标签: ios swift

我正在Swift中开发一个应用程序,我有一个文件ToursObject.swift就可以了:

import Foundation

class ToursObject {

    var nameFr: String!;
    var nameEn: String!;
    var nameEs: String!;
    var nameIt: String!;

    init(json: NSDictionary) {

        self.nameFr = json["name_fr"] as? String;
        self.nameEn = json["name_en"] as? String;
        self.nameEs = json["name_es"] as? String;
        self.nameIt = json["name_it"] as? String;

    }

}

在我的tableViewController中,我有这段代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // custom cell
    let cell = tableView.dequeueReusableCellWithIdentifier("toursCellReuseIdentifier") as! ToursTableViewCell;

    // here i get the actual preferredLanguage from previous screen which propose en, fr, it and es
    let codeCountry = NSLocale.preferredLanguages()[0] as String;
    // if we print we will have En, Fr, It or Es for codeCountry

    // I want do something like that but of course when i build I have this error message from xCode : Value of type 'ToursObject" has no member 'name'
    cell.titleLabel.text = (self.arrayOfAvailableToursObject[indexPath.item].name+codeCountry);
    // work correctly because no concatenation on the name of member
    cell.descriptionLabel.text = (self.arrayOfAvailableToursObject[indexPath.item].nameEn);

    return cell;
}

问题在于这一行,因为我不知道如何连接来调用我的字典中的好键:

cell.titleLabel.text = (self.arrayOfAvailableToursObject[indexPath.item].name+codeCountry);

我认为不可能像我想的那样做,但还有另一种解决方案吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

所以问题是你需要通过语言动态访问事物吗?在这种情况下,通过使用具体属性将JSON反序列化为对象,您可以为自己做更多的工作。为什么不保持动态?

class ToursObject {

    var nameForCountry: [String:String]!;

    init(json: NSDictionary) {

        self.nameForCountry = // deserialize into your typed dictionary;

    }

}

然后您可以按如下方式访问:

cell.titleLabel.text =     
     self.arrayOfAvailableToursObject.nameForCountry[codeCountry]

答案 1 :(得分:0)

嗨,谢谢你帮忙ColinE现在正在工作,

通过示例为那些需要知道如何解决问题的人完成答案,您可以在下面找到我的案例解释:

在我的文件ToursObject.swift中,我将其更改为:

    class ToursObject {

        var nameForCountry: [String:String]!;

        init(json: NSDictionary) {

            // array of strings for one special key with selectedLanguage
            self.nameForCountry = ["fr":(json["name_fr"] as? String)!, "en":(json["name_en"] as? String)!, "es":(json["name_es"] as? String)!, "it":(json["name_it"] as? String)!];
        }
   }

在我的tableViewController中,我现在调用适当的语言

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

        // custom cell
        let cell = tableView.dequeueReusableCellWithIdentifier("toursCellReuseIdentifier") as! ToursTableViewCell;

        // here i get the actual preferredLanguage string from previous screen which propose "en", "fr", "it" and "es"
        let codeCountry = NSLocale.preferredLanguages()[0] as String;

        // Configure labels of cell with appropriate language
        cell.titleLabel.text = (self.arrayOfAvailableToursObject[indexPath.item].nameForCountry[codeCountry]);

        return cell;
    }

希望这些答案有所帮助。

非常感谢,