Swift self&Self&Mirror

Swift self&Self&Mirror,第1张

AnyObject:代表任意类的实例,类的类型,仅类遵守的协议

AnyClass 代表任意实例的类型

Any 代表任意的类型 

t2是MetaData地址,

LGTeacher . self 是AnyClass或AnyObject

Self 类型不是特定类型,⽽是让您⽅便地引⽤当前类型,⽽⽆需重复或知道该类型的名称。

 在协议声明或协议成员声明中,Self 类型是指最终符合协议的类型。

 作为⽅法的返回类型, 作为只读下标的返回类型,作为只读计算属性的类型 

type(of: value) 动态类型分析

test函数调用之前, value 的类型是Any

test函数调用之后, value 的类型是Int

swift调用c函数

1.第一种方式

TestC.c

xxx.swift

2.第二种方式,桥接文件

swift Runtime

1.对于纯 Swift 类来说,⽅法和属性不加任何修饰符的情况下。这个时候其实已经不具备我们所谓的 Runtime 特性了,这和我们在上⼀节课的⽅法调度(V-Table调度)是不谋⽽合的。 

2.对于纯 Swift 类,⽅法和属性添加 @objc 标识的情况下,当前我们可以通过 Runtime API 拿到, 但是在我们的 OC 中是没法进⾏调度的。 

3.对于继承⾃ NSObject 类来说,如果我们想要动态的获取当前的属性和⽅法,必须在其声明前添加 @objc 关键字,否则也是没有办法通过 Runtime API 获取的。 

4.纯swift类没有动态性,但在⽅法、属性前添加dynamic修饰,可获得动态性。 

5.继承⾃NSObject的swift类,其继承⾃⽗类的⽅法具有动态性,其它⾃定义⽅法、属性想要获得动 态性,需要添加dynamic修饰。 

6.若⽅法的参数、属性类型为swift特有、⽆法映射到objective-c的类型(如Character、Tuple),则 此⽅法、属性⽆法添加dynamic修饰(编译器报错) 

Mirror

反射就是可以动态获取类型、成员信息,在运⾏时可以调⽤⽅法、属性等⾏为的特性

获取成员信息

封装

lldb打印

Demo

1.  unsafeBitCast 可以指针之间转换

2.swift_getTypeByMangledNameInContext swift标准库c函数

3.协议读取Any类型,通过关键字Self,读取真实类型的值

4.读取指针+偏移量的值

UnsafeMutablePointer(mutating: UnsafeRawPointer(p).advanced(by: numericCast(offset)).assumingMemoryBound(to: Pointee.self))

CAPI.h

第一部分 使用Swift语言开发LBS应用

1、下载iOS地图SDK的最新版本

2、申请LBS密钥(见第二部分)。

3、xCode新建工程

新建一个 Single View Application 工程。注意:Language 选择 Swift

4、工程配置

a.引入地图库&搜索库

左侧目录中选中工程名,在 TARGETS->Build Phases->Link Binary With Libaries 中点击“+”按钮,在d出的窗口中点击“Add Other”按钮,选择解压后的 MAMapKit.framework 文件添加到工程中。

搜索库的添加方法同上。

b.引入AMap.bundle资源文件

AMap.bundle资源文件中存储了定位、默认大头针标注视图等图片,可利用这些资源图片进行开发。

左侧目录中选中工程名,在右键菜单中选择Add Files to “工程名”…,从 MAMapKit.framework->Resources 文件夹中选择 AMap.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。

c.引入系统库

左侧目录中选中工程名,在TARGETS->Build Settings->Link Binary With Libaries中点击“+”按钮,在d出的窗口中查找并选择所需的库(见下表),单击“Add”按钮,将库文件添加到工程中。

备注中,2D表示使用2D栅格地图需要的系统文件,3D表示使用3D矢量地图需要的系统文件、Search表示使用搜索库需要的系统文件。

SystemConfiguration.framework、CoreTelephonySecurity.framework、Security.framework 是为了统计app信息使用。

d.Swift编译配置

首先:新建桥接头文件(放在工程路径下),这里命名为 AMapDemoSwift-Bridging-Header.h,在该头文件中import需要的库文件,代码如下:

#import <MAMapKit/MAMapKit.h>

#import <AMapSearchKit/AMapSearchAPI.h>

然后,左侧目录中选中工程名,在 TARGETS->Build Phases->Swift Compiler - Code Generation ->Objective-C Briding Header 中输入桥接文件的路径

5、地图的显示

以3D矢量地图SDK为例,进行介绍。

在 ViewController.swift 中,继承 MAMapViewDelegate 协议,在 viewDidLoad 方法中配置用户Key,初始化 MAMapView 对象,并添加到 Subview中。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/8004986.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存