SwiftUI语言基础之 Type Methods 教程及使用代码

Type Methods

实例方法是您在特定类型的实例上调用的方法。 您还可以定义在类型本身上调用的方法。 这些方法称为类型方法。 您可以通过在方法的func关键字之前写入static关键字来指示类型方法。 类可以改用class关键字,以允许子类覆盖超类对该方法的实现。

在Objective-C中,您只能为Objective-C类定义类型级别的方法。 在Swift中,您可以为所有类,结构和枚举定义类型级别的方法。 每个类型方法都明确地限定于它支持的类型。

类型方法使用点语法来调用,就像实例方法一样。 但是,您在类型上而不是在该类型的实例上调用类型方法。 在名为SomeClass的类上调用类型方法的方法如下:

class SomeClass {
    class func someTypeMethod() {
        // type method implementation goes here
    }
}
SomeClass.someTypeMethod()

在类型方法的主体内,隐式self属性是指类型本身,而不是该类型的实例。这意味着您可以使用self来区分类型属性和类型方法参数,就像处理实例属性和实例方法参数一样。

更一般而言,在类型方法主体中使用的任何不合格的方法和属性名称都将引用其他类型级别的方法和属性。一个类型方法可以使用另一个方法的名称来调用另一个类型方法,而无需在其前面加上类型名称。同样,结构和枚举上的类型方法可以使用类型属性的名称访问类型属性,而无需使用类型名称前缀。

下面的示例定义了一个称为LevelTracker的结构,该结构可跟踪玩家在游戏的不同关卡或阶段中的进度。这是一款单人游戏,但可以在单个设备上存储多个玩家的信息。

首次玩游戏时,所有游戏级别(除了第一级)都被锁定。每次玩家完成一个关卡时,设备上的所有玩家都将解锁该关卡。 LevelTracker结构使用类型属性和方法来跟踪游戏的哪些级别已解锁。它还跟踪单个玩家的当前级别。

struct LevelTracker {
    static var highestUnlockedLevel = 1
    var currentLevel = 1

    static func unlock(_ level: Int) {
        if level > highestUnlockedLevel { highestUnlockedLevel = level }
    }

    static func isUnlocked(_ level: Int) -> Bool {
        return level <= highestUnlockedLevel
    }

    @discardableResult
    mutating func advance(to level: Int) -> Bool {
        if LevelTracker.isUnlocked(level) {
            currentLevel = level
            return true
        } else {
            return false
        }
    }
}

LevelTracker结构跟踪所有玩家已解锁的最高级别。此值存储在名为maximumUnlockedLevel的类型属性中。

LevelTracker还定义了两个类型函数,以与highestUnlockedLevel属性一起使用。第一个是称为unlock(_ :)的类型函数,每当解锁新级别时,该函数都会更新highestUnlockedLevel的值。第二个是便捷类型函数,称为isUnlocked(_ :),如果特定级别的数字已被解锁,则返回true。 (请注意,这些类型方法可以访问maximumUnlockedLevel类型属性,而无需将其编写为LevelTracker.highestUnlockedLevel。)

除了其type属性和type方法之外,LevelTracker还可以跟踪单个玩家在游戏中的进度。它使用称为currentLevel的实例属性来跟踪玩家当前正在玩的级别。

为了帮助管理currentLevel属性,LevelTracker定义了一个称为advance(to :)的实例方法。在更新currentLevel之前,此方法检查所请求的新级别是否已被解锁。 advance(to :)方法返回一个布尔值,以指示它是否实际上能够设置currentLevel。由于调用先进方法(to :)忽略返回值不一定是错误的代码,因此此函数标有@discardableResult属性。有关此属性的更多信息,请参见属性。

LevelTracker结构与Player类一起使用,如下所示,用于跟踪和更新单个玩家的进度:

class Player {
    var tracker = LevelTracker()
    let playerName: String
    func complete(level: Int) {
        LevelTracker.unlock(level + 1)
        tracker.advance(to: level + 1)
    }
    init(name: String) {
        playerName = name
    }
}

Player类创建一个新的LevelTracker实例来跟踪该玩家的进度。 它还提供了一种称为complete(level :)的方法,每当玩家完成特定级别时就会调用该方法。 此方法为所有玩家解锁下一个级别,并更新玩家的进度以将他们移至下一个级别。 (Advance(to :)的布尔返回值将被忽略,因为已知该级别已通过调用上一行的LevelTracker.unlock(_ :)进行了解锁。)

您可以为新玩家创建Player类的实例,并查看该玩家完成第一级后会发生什么:

var player = Player(name: "Argyrios")
player.complete(level: 1)
print("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
// Prints "highest unlocked level is now 2"

如果您创建第二个玩家,尝试将其移动到游戏中尚未被任何玩家解锁的级别,则设置该玩家当前级别的尝试将失败:

player = Player(name: "Beto")
if player.tracker.advance(to: 6) {
    print("player is now on level 6")
} else {
    print("level 6 has not yet been unlocked")
}
// Prints "level 6 has not yet been unlocked"

推荐

基础文章推荐

经典教程推荐

上新

技术源码推荐

推荐文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技术交流

QQ:3365059189
SwiftUI技术交流QQ群:518696470

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355