在Swift语言中,关于Any,AnyObject,AnyClass的区别与联系

在Swift语言中,协议定义类或结构体应该遵守的变量和方法集合,如下所示,这个一个标准的协议的声明:

protocol NSObjectProtocol {

    func isEqual(object: AnyObject?) -> Bool
    var hash: Int { get }

    var superclass: AnyClass? { get }

    func `self`() -> Self!

    func isProxy() -> Bool

    func isKindOfClass(aClass: AnyClass) -> Bool
    func isMemberOfClass(aClass: AnyClass) -> Bool
    func conformsToProtocol(aProtocol: Protocol) -> Bool

    func respondsToSelector(aSelector: Selector) -> Bool

    var description: String { get }

    optional var debugDescription: String { get }
}

在协议中,可以声明属性,如superclass,这是一个只读属性;可以声明方法,如isEqual、isProxy等;optional关键字,表示这个属性不强制实现。而`self`外面以上顿号包围,是因为self本身是一个语法关键字,如果关键字想被用作变量名称,必须外加上顿号。

熟识了协议,好了重点来了,Any、AnyObject、AnyClass有什么区别:

  1. Any是一个空协议集合的别名,它表示没有实现任何协议,因此它可以是任何类型,包括类实例与结构体实例。Any是一个别名。
  2. AnyObject是一个成员为空的协议,任何对象都实现了这个协议。
  3. AnyClass是AnyObject.Type的别名而已。

下面看一下Any的声明,在Swift中:

/// 一个任何类型都遵守的协议类型

typealias Any = protocol<>

因其空,而成其大,老子说,我没有任何规距,所以谁都可以遵守我。protocol是一个关键字,尖括号内用于放置多个协议,下面的代码也是合乎语法的:

var sss3:protocol<NSObjectProtocol,LYProtocol1> = LYNSObject1()

下面看一下AnyObject的定义:

@objc protocol AnyObject {

}

这个协议未定义任何成员。@objc是一个声明特性,该特性用于修饰任意可以在ObjC中访问或使用的声明,比如非嵌套类,协议,类和协议中的属性和方法,初始化器,析构器,以及下标。如果你将objc特性应用于一个类或协议,它也会隐式地应用于那个类或协议的成员。对于标记了objc特性的类,编译器会隐式地为它的子类添加objc特性。

AnyObject使用@objc声明特性修饰,是因为它要做为Objc与Swift混编的使者,两者传递变量很多类型便是AnyObjct。

不同于Any,AnyObject是一个没有声明任何成员的空协议,是Any表示一个空的协议集合。AnyObject是一个协议,Any是零个协议。

最后看一个AnyClass的定义:

typealias AnyClass = AnyObject.Type

它确实仅是一个别名而已。Any也是别名,是protocol<>的别名。

以下代码,可以加深理解:

protocol LYProtocol1{
//some code
}
class LYNSObject1:NSObject,LYProtocol1{
//some code
}

var ly1:Any
var ly2:protocol<>

typealias Any1 = protocol<NSObjectProtocol>
var k:protocol<NSObjectProtocol>
var k1:NSObjectProtocol

var sss1:protocol<NSObjectProtocol> = NSObject()
var sss2:NSObjectProtocol = NSObject()
//var sss1:protocol<NSObjectProtocol,LYProtocol1> = NSObject()//错误的
var sss3:protocol<NSObjectProtocol,LYProtocol1> = LYNSObject1()//可行

AnyObject是一个协议,Any是零个协议!AnyObject用于任何类实例,而Any用于任何变量。

学习Swift技术,加入Swift书友会QQ群:259152129,与作者一起学习讨论!

时间: 2024-10-20 05:40:34

在Swift语言中,关于Any,AnyObject,AnyClass的区别与联系的相关文章

Swift语言中 String 的一些操作方法

整理自慕课网liuyubobobo老师在<玩儿转Swift>课程中的讲解,在此表示感谢!同时推荐这套视频课程http://www.imooc.com/learn/127 var str = "Welcome to Play Swift! Step by step to learn Swift." // Range的用法和相关字符串的操作代码片段  str.rangeOfString(“Step”)  // 字符串片段“Step”所处的字符范围 23..<27, 也即第

swift中Any,AnyObject,AnyClass的区别

这几个概念让人很迷惑,看了很多帖子,终于搞明白了,简单总结: Any 和 AnyObject 是 Swift 中两个妥协的产物.什么意思呢,oc中有个id关键字,表示任何对象,oc和swift混编的时候拿什么对应id呢?就发明出来了AnyObject.但是!oc中的NSString,NSArray等都是class,但是在swift中String,Array都是struct,这个怎么办呢,混编的时候NSString等类型对应的id就不能用AnyObject了,为了填坑,又搞出来个Any,表示任意类

Swift语言中的switch语句的妙用

Swift中的switch语句的类另用法: // 强大的switch语句 var a:Int = 100 switch a { case a where a < 0: println("Negative") case a where a == 0: println("Zero") case a where a > 0: println("Positive") default: println("Unknow") }

Swift语言中与C/C++和Java不同的语法(五)

这一节将会提到Swift中其他的关于函数的应用,这些内容包括有: 默认参数值和可变参数值.常量参数.返回函数类型和函数嵌套: 一.默认参数值和可变参数值 对默认参数值是指在函数的声明中就已经定义了参数的初值,比如: func sayHelloTo(name:String,greeting:String = "Hi", punctuation:String = "!"){ } 在调用的时候可以是: sayHelloTo(name:"PlayGround&qu

Swift语言中与C/C++和Java不同的语法(二)

这一部分,主要讲Swift中创新的可选型(optionals) 一.概要 可选型是Swift创新的一种新的类型,首先看一下可选型的应用场景: var errorCode : Int = 404 这时候errorCode的值是404,表示此时的错误状态码是404,当产生一种错误的时候就会获得其对应的errorCode, 但是如果没有错误那应该怎么办呢? 在C/C++和Java中我们会给errorCode赋值为0或者是null(其实null也就是0),但是我们怎么能够保证0不是一种错误的状态码呢?

c语言中,宏和函数的区别

一.代码长度:宏是完全替换,插入到程序里使得代码变长: 函数代码是只出现在一个地方,使用时则去那里调用. 二.执行速度:宏更快一些,因为在预编译阶段都已完成: 函数则慢一点,因为需要调用以及返回(压栈/出栈)额外时间. 三.操作符优先级:宏有时要少加括号而导致计算逻辑出错: 函数最后只将值返回来,结果容易预测. 四.参数求值:宏每次都要计算: 函数只需要计算一次,之后多次调用并不会导致多次求值而出错. 五.参数类型:宏不关心类型,只要参数操作合法就可以: 函数类型要一致,不同类型则需要不同函数.

C语言中的typedef跟define的区别

今天用C语言练习时涉及到了typedef和define的使用问题,那么他们的区别是啥?这种情况下为什么要用typedef?哪种情况下为什么要用define呢? 学习C的时候的你是否考虑过这个问题呢? 今天我决定梳理一下,以备后用. 相同点: 1.都可以给变量起别名 不同点: 1.define定义后可以扩展,而typedef则不可以. 1 //定义完一个整型的数据后补充定义为无符号的 2 3 #define zhengxing int 4 unsigned zhengxing;//正确 5 6 t

C语言中printf和cprintf有什么区别啊

printf()格式化输出:cprintf()格式化输出.printf()不受文本颜色.光标的控制,cprintf()受到这些的控制.举个列子:#include<stdio.h>#include<conio.h> int main(){ gotoxy(10,10);//是光标跳到(10,10)处 settextcolor(RED);//设置文本颜色为红色 printf("This is a test!"); cprintf("This is a tes

c语言中 char* 和 unsigned char* 的区别浅析(转)

原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用时作为函数的unsigned char*类型的参数调用.这个警告很容易避免,但是char*和unsigned char*到底有什么区别呢,本文作一个简单的探讨. char 和 unsigned char 的区别在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的.