切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
Swift
Swift 类和结构体(八)
Swift 类和结构体(八)
2020-05-26
Swift
前端之家
前端之家
收集整理的这篇文章主要介绍了
Swift 类和结构体(八)
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
类和结构体
Swfit并不要求你为
自定义
类和结构去创建独立的接口和实现
文件
,只需要在一个
文件
定义一个类或结构体,Swift
自动
生成
外部接口
通常类的实例被称为对象,Swift中称为实例而不是对象
1.定义
通过class和struct来声明结构体,大括号里定义它们的
内容
[objc]
view plain
copy
class
SomeClass{
//classdefinitiongoeshere
}
@H_
301
_48@struct
SomeStructure{
//structuredefinitiongoeshere
}
struct
Resolution{
varwidth=
0
varheight=
0
class
VideoMode{
varresolution=Resolution()
varinterlaced=@H_
301
_48@false
varframeRate=
0
.0
var
name
:String?
}
2.类和结构体的实例
使用初始化方法来生成新的实例
letsomeResolution=Resolution()
letsomeVideoMode=VideoMode()
3.访问属性
使用点语法访问类和结构体的属性,或者子属性
println(
"ThewidthofsomeResolutionis\(someResolution.width)"
)
//prints"ThewidthofsomeResolutionis0"
println(
"ThewidthofsomeVideoModeis\(someVideoMode.resolution.width)"
)
//prints"ThewidthofsomeVideoModeis0"
someVideoMode
.resolution
.width
=
1
2
8
0
println(
"ThewidthofsomeVideoModeisnow\(someVideoMode.resolution.width)"
)
//prints"ThewidthofsomeVideoModeisnow1280"
4.结构体类型的初始化方法
所有结构体都有一个自动生成的初始化方法,用于初始化结构体中成员的属性
letvga=Resolution(width:
6
4
0
,
height
:
4
8
0
)
5.结构体和枚举都是值类型的
值类型在赋值给变量、常量或者传入到一个函数的时候,操作的都是值的拷贝,意味着它们的实例以及实例所包含的属性在代码传值的时候都会被复制
//以下定义一个hd常量,值为(1920,1080)像素的Resolution实例,然后定义cinema变量,其值为hd,cinema的值其实是hd得拷贝副本而不是hd本身,它们是两个不同的实例
lethd=Resolution(width:
1
9
2
0
,0); background-color:inherit">height
:
1
0
8
0
)
varcinema=hd
//将cinema的width
属性
改变,而hd实例的中不会改变,两者的
修改
并不会相互影响对方,因为hd赋值给cinema的时候,实际是将hd存储的值进行拷贝,然后将拷贝的值存入cinema中
cinema
.width
=
2
0
4
8
println(
"cinemaisnow\(cinema.width)pixelswide"
)
//prints"cinemaisnow2048pixelswide"
println(
"hdisstill\(hd.width)pixelswide"
)
//prints"hdisstill1920pixelswide"
枚举也是一样的
enum
CompassPoint{
case
North,South,East,West
varcurrentDirection=CompassPoint
.West
letrememberedDirection=currentDirection
currentDirection=
.East
if
rememberedDirection==
.West
{
println(
"Theremembereddirectionisstill.West"
)
//prints"Theremembereddirectionisstill.West"
6.类是引用类型
与值类型不同,引用类型赋予到一个变量或常量之后,操作的不是拷贝,而是实例本身
以下tenEighty和alsoTenEighty虽然是常量,但依然可以修改它们的属性,因为这两个常量本身不会被改变,仅仅存了ViewMode()实例的引用
lettenEighty=VideoMode()
tenEighty
.resolution
=hd
tenEighty
.interlaced
=
@H_
301
_48@true
tenEighty
.name
=
"1080i"
tenEighty
.frameRate
=
2
5
.0
letalsoTenEighty=tenEighty
alsoTenEighty
.frameRate
=
3
0
.0
println(
"TheframeRatepropertyoftenEightyisnow\(tenEighty.frameRate)"
)
//prints"TheframeRatepropertyoftenEightyisnow30.0"
7.恒等运算符
因为类是引用类型,可能出现多个变量在引用同一个类实例的情况,所以Swift提供了两个恒等运算符,判断两个常量或者变量是否引用同一个类实例
等价于( === ) 表示两个类类型的常量或变量引用同一个实例
不等价( !== )
if
tenEighty===alsoTenEighty{
println(
"tenEightyandalsoTenEightyrefertothesameResolutioninstance."
)
//prints"tenEightyandalsoTenEightyrefertothesameResolutioninstance."
8.类和结构体的选择
结构体:
值传递
主要用来封装少量相关简单的数据值
构建一个实例在赋值或传递时,要明确封装的数据是被拷贝而不是引用
在结构体中存储的值类型属性,都是被拷贝而不是引用
结构体不需去继承另一个已存在在类型的属性或行为
在实际应用中,绝大部分的自定义数据都应该是类,而非结构体
9.集合类型的赋值和拷贝行为
Swift中的数组和字典都是结构体,当数组被赋值给一个常量或变量,或传递到函数或方法时,和字典的拷贝都与其他结构体有不同
字典类型的赋值和拷贝
如果字典中存储的key/value是值类型,在赋值或调用时,都会被拷贝,如果是引用类型,将会被引用
//以下字典key/value分别是String/Int,都是值类型,字典被拷贝时,两者都被拷贝
varages=[
"Peter"
:
2
3
,
"Wei"
:
3
5
,
"Anish"
:
6
5
,
"Katya"
:
19
]
varcopiedAges=ages
copiedAges[
"Peter"
]=
2
4
println(ages[
"Peter"
])
//prints"23"
数组的赋值和拷贝
数组的赋值和拷贝要比字典复杂,当操作数组时能提供接近C语言的
功能
,并且拷贝行为只在必要时才发生,将数组赋值给其他变量时,数组的
内容
不会被拷贝,而是被共享出来公用一个,当数组元素被
修改
,在另一组数组也
显示
同样的结果,而拷贝行为只在
修改
了数组长度的时候发生,发生拷贝的情况与字典类似
//将整数(Int)数组赋值给a,b,c变量
vara=[
1
,
2
,0); background-color:inherit">3
]
varb=a
varc=a
println(a[
0
])
//1
println(b[
0
])
println(c[
0
])
a[
0
]=
4
2
//42
//当长度发生变化,Swift会创建这个数组的拷贝,a将会是原数组的一个独立拷贝
a
.append
(
4
)
a[
0
]=
7
7
7
//777
//42
10.确保数组的唯一性
操作数组的时候有必要确认这个数组是有一个唯一拷贝的,调用unshare方法确定数组引用的唯一性,如果一个数组被多个变量引用,在其中的一个变量调用unshare方法则会拷贝此数组,此时这个变量会有属于他自己的独立数组拷贝。
b
.unshare
()
b[
0
]=-
1
0
5
println(a[
0
])
//777
println(b[
0
])
//-105
println(c[
0
])
//42
11.判断两个数组是否共用相同元素
if
b===c{
println(
"bandcstillsharethesamearrayelements."
)
}@H_
301
_48@else
{
println(
"bandcnowrefertotwoindependentsetsofarrayelements."
)
//prints"bandcnowrefertotwoindependentsetsofarrayelements."
或者判断两个数组是否共用相同的元素
if
b[
0
..
.1
]===b[
0
..
.1
]{
println(
"Thesetwosubarrayssharethesameelements."
)
println(
"Thesetwosubarraysdonotsharethesameelements."
)
//prints"Thesetwosubarrayssharethesameelements."
12.强制复制数组
通过调用copy方法进行强制复制,这方法对数组进行浅拷贝,并返回一个包含此拷贝的新数组,
varnames=[
"Mohsen"
,
"Hilary"
,
"Justyn"
,
"Amy"
,
"Rich"
,
"Graham"
,
"Vic"
]
varcopiedNames=names
.copy
()
copiedNames[
0
]=
"Mo"
println(names[
0
])
//prints"Mohsen"
unshare
方法
仅会在确认有必要的时候菜户创建数组拷贝,copy
方法
在任何时候都会创建新的拷贝,即使引用已经是唯一的
上一篇:Swift 枚举(七)
下一篇:Swift 属性(九)
猜你在找的Swift相关文章
Swift 正式开源,同时开源 Swfit 核心库和包管理器
Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语...
作者:前端之家 时间:2020-08-08
Swift开源短短一天不到Github就有9000多star
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让...
作者:前端之家 时间:2020-08-08
苹果的Swift语言开源了!
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swif...
作者:前端之家 时间:2020-08-08
使用 Swift 构建自定义的ActivityIndicator View
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jia...
作者:前端之家 时间:2020-08-08
Swift中编写单例的正确方式
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前...
作者:前端之家 时间:2020-08-08
Swift中编写单例的正确方式
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前...
作者:前端之家 时间:2020-08-08
Swift 的 NSDate 初学者指南
译者:ray16897188;校对:numbbbbb;定稿:Cee 如果问我在做过的所有项目中做的最多的事情...
作者:前端之家 时间:2020-08-08
10 个最佳的 Swift 教程实例
★ 时间就是金钱。你可以一开始就使用正确的 Swift 教程来节省时间。本文中提到的教程都是...
作者:前端之家 时间:2020-08-08
Swift Package Manager快速上手指南(一):环境搭建
CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应...
作者:前端之家 时间:2020-08-08
编写高性能的 Swift 代码
下面这篇文档收集了一系列编写高性能 Swift 代码的要诀和技巧。文档的目标读者是编译器和标...
作者:前端之家 时间:2020-08-08
编程分类
iOS
Android
Swift
Hybrid
Cocos2d-x
Flutter
Xcode
Silverlight
cocoa
Cordova
最新文章
• Swift 正式开源,同时开源
• Swift开源短短一天不到Git
• 苹果的Swift语言开源了!
• 使用 Swift 构建自定义的A
• Swift中编写单例的正确方式
• Swift中编写单例的正确方式
• Swift中编写单例的正确方式
• Swift 的 NSDate 初学者指
• 10 个最佳的 Swift 教程实
• Swift Package Manager快速
热门标签
更多 ►
调试桥
筛选栏
假异步
不会丢失
AndPermissio
权限申请
抽屉式
systemUI
信号栏
多行排列
跨多行显示
viewmode
数据共享
录制语音
视频通话
多行显示
Studio3.5
拉伸控件
望远镜
发动态
走势图
点赞控件
显示牌
冷启动
v3签名
v2签名
v1签名
本地html
外接键盘
流式标签