插槽 2.0.0

Slots 2.0.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布时间最后发布时间2016年9月
SPM支持SPM

Suyeol Jeon维护。



Slots 2.0.0

  • 作者:
  • Suyeol Jeon

Slots

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文件。