Swift的动态内容管理。
let slots = Slots()
slots.pattern = ["Month", "Picture", "Picture", "Month", "Picture"]
slots["Month"] = ["Nov 2014", "Dec 2014", "Jan 2015"]
slots["Picture"] = [Picture(1), Picture(2), Picture(3)]
然后
slots.contents // "Nov 2014", Picture(1), Picture(2), "Dec 2014", Picture(3), "Jan 2015"
slots[2] // Picture(2)
slots.type(at: 3) // "Month"
针对iOS 8+项目,使用CocoaPods
pod 'Slots'
针对iOS 8+项目,使用Carthage
github "devxoul/Slots" ~> 2.0
针对iOS 7项目,使用CocoaSeeds
github 'devxoul/Then', '2.0.0', :files => 'Slots/*.swift'
Slots可以存储所有类型的内容。每种类型的内容都必须是唯一的字符串值。
下面的代码描述了存储一些字母和数字的基本示例
let slots = Slots()
slots["alphabet"] = ["a", "b", "c"]
slots["number"] = [1, 2, 3, 4, 5]
Slots可以根据指定的模式对存储内容进行排序。您可以将内容类型数组分配给pattern
属性来指定内容模式。
例如,当内容模式设置为["alphabet", "number"]
时,Slots会将"alphabet"
和"number"
的内容交替排序。
slots.pattern = ["alphabet", "number"]
slots["alphabet"] = ["a", "b", "c"]
slots["number"] = [1, 2, 3, 4, 5]
slots.contents // ["a", 1, "b", 2, "c", 3]
尽管在"alphabet"
中有5个对象,但slots.contents
返回的数组只包含3个数字,因为经过3次交替后,"alphabet"
中没有更多的对象了。您可以使用count
属性检查排序内容的元素数量。
slots.count // 6
相同的内容类型可以出现多次。
slots.pattern = ["alphabet", "number", "number"]
slots.contents // ["a", 1, 2, "b", 3, 4, "c", 5]
您可以将可重复的内容类型分配给repeatables
属性。在repeatables
中指定的内容类型将被重复,直到内容全部耗尽。
slots.pattern = ["alphabet", "number"]
slots.repeatables = ["number"] // make repeatable
slots["alphabet"] = ["a", "b", "c"]
slots["number"] = [1, 2, 3, 4, 5]
slots.contents // ["a", 1, "b", 2, "c", 3, 4, 5]
Slots提供了获取内容的简单方法。假设slots声明如下
slots.pattern = ["alphabet", "number", "number"]
slots["alphabet"] = ["a", "b", "c"]
slots["number"] = [1, 2, 3, 4, 5]
然后我们可以像数组一样通过订阅获取slots中的第7个内容。
slots[6] // "c"
如果我们尝试获取一个不存在的索引的值,它将返回nil
。
slots[6] // "c"
slots[7] // 5
slots[8] // nil
我们可以通过子范围来获取切片。
slots[0..<4] // "a", 1, 2, "b"
让我们将槽(Slots)应用到实际情况中。假设我们需要制作一个类似于 StyleShare 的风格新闻源。一个新闻源中包含多种内容类型,例如:风格、特色用户、特色集合、广告等。
// declare content types as constant
struct ContentType {
static let style = "style"
static let advertisement = "advertisement"
}
func viewDidLoad() {
super.viewDidLoad()
// each advertisements appear after 3 styles
self.slots.pattern = [
ContentType.style, ContentType.style, ContentType.style
ContentType.advertisement
]
// styles must be repeated even if there's no advertisements.
self.slots.repeatables = [ContentType.style]
}
func fetchStyles() {
self.slots[ContentType.style] = // styles from API response
self.tableView.reloadData()
}
func fetchAdvertisements() {
self.slots[ContentType.advertisement] = // advertisements from API response
self.tableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.slots.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: NSIndexPath) -> UITableViewCell {
let contentType = self.slots.type(at: indexPath.row)
let content = self.slots[indexPath.row]
switch contentType {
case ContentType.style:
let cell = // ...
cell.style = content as Style
return cell
case ContentType.advertisement:
let cell = // ...
cell.advertisement = content as Advertisement
return cell
}
}
槽(Slots)遵循MIT许可协议。更多信息请查看LICENSE文件。