swift开发第九篇——any和anyobject&typealias和泛型接口

淡泊宁静_JP      2022-02-11     180

关键词:

本篇分为两部分:

一、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中any,anyobject,anyclass的区别

...看了很多帖子,终于搞明白了,简单总结:Any 和 AnyObject 是Swift中两个妥协的产物。什么意思呢,oc中有个id关键字,表示任何对象,oc和swift混编的时候拿什么对应id呢?就发明出来了AnyObject。但是!oc中的NSString,NSArr... 查看详情

第九篇swift的基本使用

1.访问权限/*1>internal:内部的1.默认情况下所有的类&属性&方法的访问权限都是internal2.在本模块(项目/包/target)中可以访问2>private:私有的1.只有在本类中可以访问3>open:公开的1.可以跨模块(项目/包/target)都是可以访问4>f... 查看详情

适配swift3

AnyvsAnyObject将项目里的AnyObject转成Any可能是大家遇到的第一件适配大事。如何解释这个变化呢?在Swift3之前,我们可以写完一个项目都只用AnyObject来代表大多数实例,好像不用与Any类型打交道。但事实上,Any和AnyObject是有明显区... 查看详情

深入理解ajax系列第九篇——jquery中的ajax

前面的话  jQuery提供了一些日常开发中需要的快捷操作,例如load、ajax、get和post等,使用jQuery开发ajax将变得极其简单。这样开发人员就可以将程序开发集中在业务和用户体验上,而不需要理会那么繁琐的XMLHTTPRequest对象。jQuery... 查看详情

flask第九篇flask-script组件

...kScript扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Pythonshell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开;FlaskScript和Flask本身的工作方式类似,... 查看详情

第九篇:进程与线程

一、paramiko模块二、ssh登录过程和上传下载三、进程和线程简绍四、多线程、多线程实例五、守护线程六、线程锁七、递归锁八、信号量九、线程间通信event十、queue消息队列十一、进程Queue数据传递十二、pipe管道通信十三、进程... 查看详情

第九篇道

第九篇 道  “道”这个字出现在人们的视野中,已经有很悠久的历史。但是人们对于“道”这个字的理解非常模糊,都是盲目地去猜测,不知道这个字真正的意义是什么。其实,“道”就是轨道,也可以称之为“宇宙... 查看详情

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

...NSFastEnumerationIterator.Element”(又名“Any”)不符合协议“AnyObject”【英文标题】:Type\'NSFastEnumerationIterator.Element\'(aka\'Any\')doesnotconformtoprotocol\'AnyObject\'【发布时间】:2016-10-3000:37:16【问题描述】:我正在尝试将我的应用程序更新... 查看详情

(第九篇)iptables详解

常见的网络攻击形式1.拒绝服务攻击:DOS2.分布式拒绝服务攻击DDOS3.漏洞入侵4.口令猜测以上内容简单了解,具体可自行百度,此处不必知晓。Linux防火墙基础Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,... 查看详情

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

】NSFastEnumerationIterator.Element(又名Any)不符合协议“AnyObject”【英文标题】:NSFastEnumerationIterator.Element(akaAny)doesnotconformtoprotocol\'AnyObject\'【发布时间】:2016-09-0722:58:48【问题描述】:升级到Xcode8(Swift3)后,当我尝试在快照中单步... 查看详情

第九篇数据表设计和保存item到json文件

上节说到Pipeline会拦截item,根据设置的优先级,item会依次经过这些Pipeline,所以可以通过Pipeline来保存文件到json、数据库等等。下面是自定义json#存储item到json文件classJsonWithEncodingPipeline(object):def__init__(self):#使用codecs模块来打开... 查看详情

directx11第九篇光照模型——高光

      本系列文章主要翻译和参考自《Real-Time3DRenderingwithDirectXandHLSL》一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正。      这里是书中的代码和资源。      本... 查看详情

第九篇googlenet——论文翻译

文章目录摘要 查看详情

java基础第九篇之final和内部类等

final关键字:final:最终,终极 final:作用:修饰类,变量,方法、成员变量的访问1.final修饰变量:  final修饰局部变量:把这个局部变量变成一个厂里,这个厂里只能被赋值一次final修饰成员变量:要求这个成员变量在创建对象之前... 查看详情

第九篇:docker镜像仓库(代码片段)

环境说明:操作系统:centos7内核版本:[[email protected]~]#uname-r3.10.0-693.21.1.el7.x86_64摘要:仓库(Repository)是集中存放镜像的地方,与之关联的是注册服务器。那注册服务器和仓库有什么关系呢?比如仓库地址为:https://dl.docker... 查看详情

javascript运动系列第九篇——碰撞运动

×目录[1]碰撞检测[2]无损碰撞[3]有损碰撞前面的话  碰撞可以分为碰壁和互碰两种形式,上篇介绍了碰壁运动,本文将从浅入深地介绍碰撞运动的互碰形式 碰撞检测  对于互碰形式的碰撞运动来说,首先要解决的是... 查看详情

混合编程jni第九篇之jni总结

 系列目录:【混合编程Jni】系列目录_香菜聊游戏的博客-CSDN博客动态库的加载可以使用标准System.loadLibrary从共享库加载原生代码。关于参数传递int、char等这样的基本数据类型,在本地代码和JVM之间进行复制传递,而对象是... 查看详情

python学习第九篇:zipfile库操作压缩包(代码片段)

​Python学习第九篇:zipfile库操作压缩包——活动地址:CSDN21天学习挑战赛zipfile是python里用来做zip格式编码的压缩和解压缩的zipfile里有两个非常常用的class,分别是ZipFile和ZipInfo,在绝大多数的情况下,我们只需要使用这... 查看详情