SwiftUI Swift 从入门到精通之高级功能 01 范型类型

高级功能 01 范型类型

当我们在Swift中构建与其他类型交互的东西时,我们通常会指定我们要直接交互的类型。这是很有用的,因为它意味着我们知道该类型所具有的功能; 我们可以使用这些功能,并确保输出具有正确的类型。但是,我们现在有了一个只能与指定类型交互的构造;它不能与其他t一起重用 是,即使概念是相同的。

泛型使我们有一个定义的类型,同时一般适用于其他类型。也许,它最好用一个例子来说明。

实战需求

我们将创建一个自定义集合对象,该对象将存储用户复制的最后五个字符串,以便它们不仅可以粘贴复制的最后一个字符串,还可以粘贴最后五个字符串中的任何一个。你可以添加stri 注册到列表中,并要求列表中的所有字符串,这将返回最新的到最古老的:

class RecentList { 
    var slot1: String? 
    var slot2: String? 
    var slot3: String? 
    var slot4: String? 
    var slot5: String? 
    func add(recent: String) { 
    // Move each slot down 1 
    slot5 = slot4 
    slot4 = slot3 
    slot3 = slot2 
    slot2 = slot1 
    slot1 = recent 
    }

    func getAll() -> [String] { 
    var recent = [String]()
    if let slot1 = slot1 {
         recent.append(slot1) 
    }
    if let slot2 = slot2 { 
        recent.append(slot2) 
    }
    if let slot3 = slot3 { 
        recent.append(slot3) 
    }
    if let slot4 = slot4 { 
        recent.append(slot4) 
    }
    if let slot5 = slot5 { 
        recent.append(slot5) }return recent 
    }
}

let recentlyCopiedList = RecentList() 
recentlyCopiedList.add(recent: "First") 
recentlyCopiedList.add(recent: "Next") 
recentlyCopiedList.add(recent: "Last") 
var recentlyCopied = recentlyCopiedList.getAll() 
print(recentlyCopied) 
// Last, Next, First

解决方案

1. 修改“记录列表”对象以定义通用类型列表列表类型,我们使用它代替字符串:

class RecentList<ListItemType> { 
    var slot1: ListItemType? 
    var slot2: ListItemType? 
    var slot3: ListItemType?
    var slot4: ListItemType? 
    var slot5: ListItemType? 
    func add(recent: ListItemType) {
        // Move each slot down 1 
        slot5 = slot4 
        slot4 = slot3 
        slot3 = slot2 
        slot2 = slot1 
        slot1 = recent 
        }
    func getAll() -> [ListItemType] { 
        var recent = [ListItemType]() 
        if let slot1 = slot1 { 
            recent.append(slot1)
        }
        if let slot2 = slot2 { 
            recent.append(slot2) 
        }
        if let slot3 = slot3 { 
            recent.append(slot3) 
        }
        if let slot4 = slot4 { 
            recent.append(slot4) 
        }
        if let slot5 = slot5 { 
            recent.append(slot5) 
        }
        return recent 
    } 
}

2. 在创建记录列表时,请提供一个指定的类型,字符串,它将用于替换此记录列表实例的泛型类型:

let recentlyUsedWordList = RecentList<String>() recentlyUsedWordList.add(recent: "First") recentlyUsedWordList.add(recent: "Next") recentlyUsedWordList.add(recent: "Last") var recentlyUsedWords = recentlyUsedWordList.getAll() print(recentlyUsedWords) // Last, Next, First

3. 创建一个简单的人员对象:

class Person { 
    let name: String 
    init(name: String) { 
        self.name = name 
    } 
}

4. 创建一些人来添加到我们最近的联系人列表中:

let rod = Person(name: "Rod") 
let jane = Person(name: "Jane") 
let freddy = Person(name: "Freddy")

5. 创建一个新的历史记录列表,并提供特定的人员类型:

let lastCalledList = RecentList<Person>()

6.将人员对象添加到此列表中:

lastCalledList.add(recent: freddy) 
lastCalledList.add(recent: jane) 
lastCalledList.add(recent: rod)

7. 获取列表中的所有人员,由于这是键入的人员对象数组,请打印他们的名称属性:

let lastCalled = lastCalledList.getAll() 
for person in lastCalled { 
    print(person.name) 
}
// Rod 
// Jane 
// Freddy

我们现在有一个通用的记录列表类,我们已经使用了字符串和一个自定义的人类。


精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复