Swift基础-AnyObject&Any&AnyClass

Posted 一眼万年的星空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift基础-AnyObject&Any&AnyClass相关的知识,希望对你有一定的参考价值。

1. .self

1. 对象的self 是对象的本身,person 对象的类型是Person类。

 

2. 类的self,是类的本身. Person类的类型是Person.Type

 

2. .Type

Person.Type 表示一种新的类型, 是Person 所属于的类型

3. type(of:) 

  • 用来获取类的类型
  • 用来获取对象的类型

从源码中,断点跟踪反射的源码,其实可以看出获取到对象的类型,实际上就是该对象的metadata的地址:

 

3. AnyObject 

可以代表任意类的实例对象 & 类的类型 & 仅类能遵守的协议

1. 代表类的实例对象

 

class Active {
    var action: String = "run"
}
let a = Active()
let active:AnyObject = a

 

2. 代表类的类型

class Active {
    var action: String = "run"
}

let active:AnyObject = Active.self

 

3. 协议遵守AnyObject,代表仅类能遵守这个协议

 

4. AnyClass

AnyObject的类型,是AnyClass, 代表任意实例的类型,它的源码定义如下:

public typealias AnyClass = AnyObject.Type

 

使用:

 

let p: AnyClass = type(of: person0)
let p1: AnyClass = Person.self

 

5. Any

AnyObject 只能是代表和类相关的,Any 除了和类相关,还可以代表基本数据类型。也就是Any代表任意类型

let p1: Any = Person.self
let p4: Any = Person()
let p2: Any = 10
let p3: Any = Array<Any>()

 

青山不改,绿水长流,后会有期,感谢每一位佳人的支持!

Swift开发第九篇——Any和AnyObject&typealias和泛型接口

本篇分为两部分:

一、Swift中的Any和AnyObject

二、Swift中的typealias和泛型接口

 


 

一、Swift中的Any和AnyObject

  在 Swift 中,AnyObject 可以代表任何 class 类型的实例,Any 可以表示任意类型,包括方法(func)类型,相当于 OC 中的 id。因为 id 可以为空,所以 AnyObject 也是Optional类型的。

验证 Any 和 AnyObject 的特性:

import UIKit
let swiftInt: Int = 1
let swiftString: String = "miao"
var array: [AnyObject] = []
array.append(swiftInt)
array.append(swiftString)

 数组 array 中的情况:

技术分享

  我们这里生命了一个 Int 和一个 String 类型的常量,按理说他们只能被 Any 代表,而不能被 AnyObject 代码,但是编译运行可以通过。这是因为在 Swift 和 Cocoa 中的这几个对应的类型是可以进行自动转换的。如果对性能要求高还是尽量使用原生的类型。在变成过程中还是尽量明确数据类型,少用 AnyObject。

二、Swift中的typealias和泛型接口

在 Swift 中是没有泛型接口的,但是使用 typealias 可以在接口里定义一个必须实现的别名。

class Person<T> {}
typealias WorkId = String
typealias Worker = Person<WorkId>

protocol GeneratorType {
    typealias Element
    mutating func next() -> Self.Element?
}
protocol SequenceType {
    typealias Generator : GeneratorType
    func generate() -> Self.Generator
}

正常情况下,我们的代码是这样的:

func distanceBetweenPoint(point: CGPoint, toPoint: CGPoint) -> Double {
    let dx = Double(toPoint.x - point.x)
    let dy = Double(toPoint.y - point.y)
    return sqrt(dx * dx + dy * dy)
}
let origin: CGPoint = CGPoint(x: 0, y: 0)
let point: CGPoint = CGPoint(x: 1, y: 1)
let distance: Double =  distanceBetweenPoint(origin, toPoint: point)

利用 typealias 之后将会大大提高我们代码的阅读性:

typealias Location = CGPoint
typealias Distance = Double
func distanceBetweenPoint(location: Location,
    toLocation: Location) -> Distance {
        let dx = Distance(location.x - toLocation.x)
        let dy = Distance(location.y - toLocation.y)
        return sqrt(dx * dx + dy * dy)
}
let originP: Location = Location(x: 0, y: 0)
let pointP: Location = Location(x: 1, y: 1)
let distanceD: Distance =  distanceBetweenPoint(origin, toLocation: point)

 

以上是关于Swift基础-AnyObject&Any&AnyClass的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 AnyObject 和 Any

swift中Any,AnyObject,AnyClass的区别

适配swift3

类型“NSFastEnumerationIterator.Element”(又名“Any”)不符合协议“AnyObject”

NSFastEnumerationIterator.Element(又名 Any)不符合协议“AnyObject”

Xcode 8 beta 6 AnyObject Swift 3 变化