Swift 类型转换 `as`,`is`,`Any`,`AnyObject`

swift

/// 父类 Person

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

/// 子类 Woman

    class Woman: Person {
        var female: String
        init(name: String, male: String) {
            self.female = male
            super.init(name: name)
        }
    }

/// 子类 Man

class Man: Person {
        var weight: String
        init(name: String, weight: String) {
            self.weight = weight
            super.init(name: name)
        }
    }
let arrays = [
            Woman(name: "gzz", male: "she"),
            Woman(name: "glz", male: "she"),
            Man(name: "ty", weight: "180"),
            Man(name: "az", weight: "101"),
            Man(name: "az", weight: "102")
        ]  /// arrays 的类型被推断为Person
检查类型(Checking Type)

用类型检查操作符(is)来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false
下面的例子定义了两个变量,womanCountmanCount,用来计算数组 arraysWomanMan 类型的实例数量:

var womanCount = 0
        var manCount = 0
        
        for item in arrays{
            if item is Woman{
                ++womanCount
            }
            if item is Man{
                ++manCount
            }
        }
        print("womamCount: \(womanCount)") // 2
        print("manCount: \(manCount)")     // 3

数组中的每一个 item 可能是 WomanMan。事前你不知道每个 item 的真实类型,所以使用类型转换(as?)去检查

for item in arrays{
            if let _ = item as? Woman{
                print("woman")
                //
            }
            if let _ = item as? Man{
                print("man")
                //
            }
        }
Any 和 AnyObject 的类型转换

Swift 为不确定类型提供了两种特殊的类型别名:
AnyObject 可以表示任何类类型的实例。
Any 可以表示任何类型,包括函数类型。
AnyObject
下面的示例定义了一个 [AnyObject] 类型的数组并填入三个 Man 类型的实例:

let objects: [AnyObject] = [
            Man(name: "Xt", weight: "180"),
            Man(name: "Xt1", weight: "180"),
            Man(name: "Xt2", weight: "180"),
        ]

因为知道这个数组只包含 Man 实例,你可以直接用(as!)下转并解包到非可选的 Man 类型

for object in objects{
            let man = object as! Man
            print("man :'\(man.name)'")
        }

Any
使用 Any 类型来和混合的不同类型一起工作,包括函数类型和非类类型。它创建了一个可以存储

var things = [Any]()
        // 添加
        things.append(0)
        things.append(3.14159)
        things.append("hello")
        things.append((3.0, 5.0))
        things.append(Man(name: "Xt", weight: "171"))
        things.append(Woman(name: "Xt1", male: "ll"))

你可以在 switch 表达式的 case 中使用 isas 操作符来找出只知道是 AnyAnyObject 类型的常量或变量的具体类型。下面的示例迭代 things 数组中的每一项,并用 switch 语句查找每一项的类型。有几个 switch 语句的 case 绑定它们匹配到的值到一个指定类型的常量,从而可以打印这些值

for thing in things {
            switch thing {
            case 0 as Int:
                print("zero as an Int")
            case let someDouble as Double where someDouble > 0:
                print("a positive double value of \(someDouble)")
            case let someString as String:
                print("a string value of \"\(someString)\"")
            case let (x, y) as (Double, Double):
                print("an (x, y) point at \(x), \(y)")
            case let man as Man:
                print("Man: \(man.name)")
            case let woman as Woman:
                print("woman: \(woman.name)")
            default:
                print("something else")
            }
        }

个人博客站http://summerxx.com/

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

推荐阅读更多精彩内容

  • 132.转换错误成可选值 通过转换错误成一个可选值,你可以使用 try? 来处理错误。当执行try?表达式时,如果...
    无沣阅读 1,244评论 0 3
  • 类型转换是一种检查实例类型的方法,或者将该实例视为来自其自身类层次结构中的其他地方的不同超类或子类。Swift中的...
    Joker_King阅读 2,507评论 0 0
  • Swift 语言类型转换可以判断实例的类型。也可以用于检测实例类型是否属于其父类或者子类的实例。 Swift 中类...
    零度_不结冰阅读 282评论 0 0
  • 类型转换是一种检查示例的一种方式,也是让实例作为它的父类或者子类的一种方式。 类型转换在Swift中使用is 和 ...
    冰三尺阅读 376评论 0 0
  • 告诉你我的爱情,女人要懂取舍 我跟老公同一年毕业于江城...
    f2b94d4c235e阅读 269评论 0 0