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();
//}
}