Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用swift构造类型化词典_Ios_Swift - Fatal编程技术网

Ios 使用swift构造类型化词典

Ios 使用swift构造类型化词典,ios,swift,Ios,Swift,我想创建一个类型化地图字典类,以满足以下要求: func testMap() { var map = ActivitiesMap() var activity = Activity() activity.title = "Activity 1" activity.uuid = "asdf1234" map[activity.uuid] = activity for (key, mapActivity

我想创建一个类型化地图字典类,以满足以下要求:

func testMap() {
        var map = ActivitiesMap()
        var activity = Activity()
        activity.title = "Activity 1"
        activity.uuid = "asdf1234"
        map[activity.uuid] = activity

        for (key, mapActivity) in map {
            logger.debug("ACTIVITY MAP: \(key)=\(mapActivity)")
        }
    }
简而言之,我希望这个类既是一个字典,这样它就可以在for循环中使用,但是我希望确保键是字符串,值是活动对象

我尝试了许多从字典继承或键入类的变体,但到目前为止,它导致了多个错误

编辑: 我认为一个简单的通用字典是行不通的,比如String:Activity。我想在ActivityMap类中有额外的方法,比如getAllActivitiesBetweenDates


我需要一个实际的类定义,而不是一个通用的字典表达式。

这对我很有用。不确定ActivitiesMap类中有什么,只是键入了一个字典

class Activity{
    var title:String = "";
    var uuid: String = "";

}

func testMap() {
    //var map = ActivitiesMap()
    var map: Dictionary< String, Activity> = Dictionary< String, Activity>();
    var activity = Activity()
    activity.title = "Activity 1"
    activity.uuid = "asdf1234"
    map[activity.uuid] = activity

    for (key, mapActivity) in map {
        println("ACTIVITY MAP: \(key)=\(mapActivity)")
    }
}

testMap();
您可以使用typealias关键字定义任何类型的好名称

以下是如何将其用于您的代码:

class Activity { /* your code */ }
typealias ActivityMap = Dictionary<String, Activity>

var activityDict = ActivityMap()
应该打印

id: a2 - title2
id: a3 - title3
id: a1 - title1

键顺序不能保证相同

您可以通过实现下标运算符使其看起来像字典

并符合序列协议以支持in-loop


简单的旧字典有什么问题?我不想扩展它,因为所有的字典都会得到这个扩展。我不能用我能找到的任何方式在类继承中使用它。从下标和序列的实现来看,似乎可以将它用作类似字典的对象。还在努力…好了,就快到了。。。但我实际上想向ActivityMap添加自定义函数,例如GetAllActivitiesBetweenDassStart,endSo编写扩展。该扩展是修改所有字典结构还是只修改ActivityMap?我理解类型别名的方式是,如果我扩展ActivityMap,所有字典也会得到该扩展。。。或者情况并非如此?添加了扩展示例。让我知道它是否适用于您?然后在顶层编写一个通用函数来处理此问题。从名字上看,听起来你可以把它表达成一个过滤器。我做到了。。。实际上,直接在循环中尝试似乎我需要实现序列协议。。。所以我越来越近了。您定义的类不能在for循环中正常工作。这样的实现需要大量的委托,代码只传递函数调用。现在尝试序列实现。@Keenle是的。问题是什么?我需要很多代码来传递函数调用。不是优雅的解决方案。
extension Dictionary {
    func getAllActivitiesBetweenDates(fromDate:NSDate, toDate:NSDate) -> Array<Activity>
        // your code
        return []
    }
}
let matchedActivities = activityDict.getAllActivitiesBetweenDates(/*date*/, /*date*/)
class Activity {
    var title=""
    var id=""
    init(id:String, title:String) { self.id=id; self.title = title }
}



var activities = [String:Activity]()
let a1 = Activity(id:"a1", title:"title1")
let a2 = Activity(id:"a2", title:"title2")
let a3 = Activity(id:"a3", title:"title3")
activities[a1.id] = a1
activities[a2.id] = a2
activities[a3.id] = a3

for (id,activity) in activities {
    println("id: \(id) - \(activity.title)")
}
id: a2 - title2
id: a3 - title3
id: a1 - title1
struct ActivitiesMap : Sequence {
    var map = [String:Activity]()

    subscript(key: String) -> Activity? {
    get {
        return map[key]
    }
    set(newValue) {
        map[key] = newValue
    }
    }

    func generate() -> GeneratorOf<(String, Activity)> {
        var gen = map.generate()
        return GeneratorOf() {
            return gen.next()
        }
    }

    // I can't find out type of map.generator() now, if you know it, you can do
    //func generate() -> /*type of map.generator()*/ {
    //    return map.generate();
    //}

}