我有一个带静态表的设置页面,用户可以在其中选择每个工作日可用的工作时间(每个工作日一个部分)。
为了不必为每个工作日编写相同的代码,我创建了一个名为datepickers
的字典数组,允许我将相同的逻辑应用于override func tableView
多天。 The array is set up in way so that it can access the date pickers after the class has been initialised
来自Ruby背景我们使用动态变量并且没有明确声明变量类型,我不确定如何键入此var datePickers : [???]
。输入这个变量的正确方法是什么,更一般地说,我的方法是正确的,可以通过正确的字典数组来重构它吗?
import UIKit
class AvailabilityController: UITableViewController {
@IBOutlet weak var mondaysFromDatePicker: UIDatePicker!
@IBOutlet weak var mondaysToDatePicker: UIDatePicker!
@IBOutlet weak var tuesdaysFromDatePicker: UIDatePicker!
@IBOutlet weak var tuesdaysToDatePicker: UIDatePicker!
var datePickers : [???] = {
get {
return [
["section": 0, "row": 2, "datePicker": self.mondaysFromDatePicker],
["section": 0, "row": 4, "datePicker": self.mondaysToDatePicker],
["section": 1, "row": 2, "datePicker": self.tuesdaysFromDatePicker],
["section": 1, "row": 4, "datePicker": self.tuesdaysToDatePicker]
]
}
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
for datePicker in datePickers {
if indexPath.section == datePicker["section"]! && indexPath.row == datePicker["row"]! {
let height:CGFloat = datePicker["datePicker"]!.hidden ? 0.0 : 216.0
return height
}
}
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
}
答案 0 :(得分:1)
字典数组的类型为d = dict()
for i, letter in enumerate(letterList):
d[letter] = numberList[i]
。
但请注意,您不能在同一个表达式中说=和[[NSObject:AnyObject]]
。这个东西是计算属性,或者它是带有初始化器的存储属性;你试图同时做到这一点。
例如,如果你想要一个计算属性,你可以写:
get
您的测试以查看哪个日期选择器对应于哪个索引路径可以像这样读取:
var datePickers : [[NSObject:AnyObject]]
{
return [
["section": 0, "row": 2, "datePicker": self.mondaysFromDatePicker],
["section": 0, "row": 4, "datePicker": self.mondaysToDatePicker],
["section": 1, "row": 2, "datePicker": self.tuesdaysFromDatePicker],
["section": 1, "row": 4, "datePicker": self.tuesdaysToDatePicker]
]
}
但是,我必须补充一点,那就是我实际上不会做这些事情。我会制作索引路径和日期选择器的字典:
for datePicker in self.datePickers {
if let sec = datePicker["section"] as? Int where sec == indexPath.section,
let row = datePicker["row"] as? Int where row == indexPath.row {
// do something and return something
}
}
为什么呢?因为如果你这样做,那么为这个索引路径获取正确的日期选择器非常简单:
var datePickers : [NSIndexPath:UIDatePicker] {
return [
NSIndexPath(forRow: 2, inSection: 0):self.mondaysFromDatePicker,
NSIndexPath(forRow: 4, inSection: 0):self.mondaysToDatePicker,
NSIndexPath(forRow: 2, inSection: 1):self.tuesdaysFromDatePicker,
NSIndexPath(forRow: 4, inSection: 1):self.tuesdaysToDatePicker,
]
}