切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
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 构造过程+析构过程(十三)
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
301
_0@
构造过程 (Initialization)
1.存储类型的初始赋值
类和结构在创建实例的时候,必须为所有的存储
属性
设置值,不能为nil
1.1构造器
构造器在创建某个特定类型的新实例的时候调用,最简形式类似不带参数的方法,以init命名
[objc]
view plain
copy
@H_
502
_20@
struct
Fahrenheit{
var
temperature
:Double
@H_
502
_20@
init(){
temperature=
3
2
.0
@H_
502
_20@
}
}
@H_
502
_20@
varf=Fahrenheit()
println(
"Thedefaulttemperatureis\(f.temperature)°Fahrenheit"
)
@H_
502
_20@
//prints"Thedefaulttemperatureis32.0°Fahrenheit"
1.2默认属性值
在属性生命的时候直接为其设置默认值
vartemperature=
3
2
.0
@H_
502
_20@
}
2.定制化构造过程
2.1构造参数
在定义构造器的时候提供构造参数,语法跟函数和方法相同
struct
Celsius{
temperatureInCelsius
:Double=
0
.0
@H_
502
_20@
init(fromFahrenheit
fahrenheit
:Double){
temperatureInCelsius=(fahrenheit-
3
2
.0
)/
1
.8
init(fromKelvin
kelvin
:Double){
@H_
502
_20@
temperatureInCelsius=kelvin-
2
7
3
.15
letboilingPointOfWater=Celsius(fromFahrenheit:
2
1
2
.0
)
//boilingPointOfWater.temperatureInCelsiusis100.0
letfreezingPointOfWater=Celsius(fromKelvin:
2
7
3
.15
)
//freezingPointOfWater.temperatureInCelsiusis0.0
2.2内部和外部参数名
构造函数存在一个构造器内部使用的参数名和一个在调用时使用的外部参数名,如果没有提供参数的外部名字,Swift会自动为每个构造器的参数生成一个跟内部参数名相同的外部参数名
struct
Color{
letred=
0
.0
,green=
0
.0
,blue=
0
.0
@H_
502
_20@
init(red:Double,
green
:Double,
blue
:Double){
self
.red
=red
@H_
301
_276@self
.green
=green
self
.blue
=blue
@H_
502
_20@
letmagenta=Color(red:
1
.0
,0); background-color:inherit">green
:
0
.0
,0); background-color:inherit">blue
:
1
.0
)
//如果不通过外部参数名传值,编译时无法通过
@H_
502
_20@
letveryGreen=Color(
0
.0
,
1
.0
,
0
.0
)
//thisreportsacompile-timeerror-externalnamesare
required
2.3可选属性类型
如果定义的类型包含一个可以为空的存储型属性,需要将其定义为可选类型 (optional type), 则自动初始化为nil,表示这个属性是故意初始化设置为空的
class
SurveyQuestion{
text
:String
@H_
502
_20@
var
response
:String?
init(text:String){
@H_
301
_276@self
.text
=text
funcask(){
println(text)
@H_
502
_20@
letcheeseQuestion=SurveyQuestion(text:
"Doyoulikecheese?"
)
cheeseQuestion
.ask
()
//prints"Doyoulikecheese?"
cheeseQuestion
.response
=
"Yes,Idolikecheese."
2.4构造过程中常量的修改
只要在构造过程结束后能确定常量的值,就可以在构造过程之中随意修改常量的值
//尽管text
属性
是常量,但在构造过程之中还是可以
修改
的,构造过程结束时候不能再
修改
了
class
SurveyQuestion{
@H_
502
_20@
let
text
:String
response
:String?
@H_
502
_20@
init(text:String){
self
.text
=text
funcask(){
@H_
502
_20@
println(text)
letbeetsQuestion=SurveyQuestion(text:
"Howaboutbeets?"
)
@H_
502
_20@
beetsQuestion
.ask
()
//prints"Howaboutbeets?"
@H_
502
_20@
beetsQuestion
.response
=
"Ialsolikebeets.(Butnotwithcheese.)"
3.默认构造器
Swift为素有属性已提供默认值的但自身没有构造器的结构体或基类提供一个默认的构造器,构造器创建一个将所有属性值都设置为默认值的实例
class
ShoppingListItem{
name
:String?
@H_
502
_20@
varquantity=
1
varpurchased=
false
varitem=ShoppingListItem()
@H_
502
_20@
@H_
301
_276@struct
Size{
varwidth=
0
.0
,height=
0
.0
lettwoByTwo=Size(width:
2
.0
,0); background-color:inherit">height
:
2
.0
)
4.值类型的构造器代理
构造器通过调用其他构造器来完成实例的部分构造,提高代码利用率,称为构造器的代理
struct
Point{
@H_
502
_20@
varx=
0
.0
,y=
0
.0
struct
Rect{
varorigin=Point()
@H_
502
_20@
varsize=Size()
init(){}
@H_
502
_20@
init(origin:Point,0); background-color:inherit">size
:Size){
self
.origin
=origin
@H_
301
_276@self
.size
=size
init(center:Point,248)">
letoriginX=center
.x
-(size
.width
/
2
)
@H_
502
_20@
letoriginY=center
.y
-(size
.height
/
2
)
self
.init
(origin:Point(x:originX,0); background-color:inherit">y
:originY),0); background-color:inherit">size
:size)
@H_
502
_20@
letbasicRect=Rect()
//basicRect'soriginis(0.0,0.0)anditssizeis(0.0,0.0)
letoriginRect=Rect(origin:Point(x:
2
.0
,0); background-color:inherit">y
:
2
.0
),
@H_
502
_20@
size
:Size(width:
5
.0
,0); background-color:inherit">height
:
5
.0
))
//originRect'soriginis(2.0,2.0)anditssizeis(5.0,5.0)
5.类的继承和构造过程
类里所有的存储类型属性包括继承父类的属性都需要在构造过程中设置初始值,Swift提供两种类型的类构造器来确保所有类实例中的存储属性都能获得初始值
5.1指定构造器和便利构造器
指定构造器是类中最主要的构造器,将初始化类中所提供的所有属性,每个类至少需要一个指定构造器,便利构造器是辅助型的构造器,可调用同一类中的指定构造器,并为其参数提供默认值
5.2构造器链
Swift采用三条规则来限制构造器之间的代理调用
a.指定构造器必须调用其直接父类的指定构造器
b.便利构造器必须调用同一类中定义的其他构造器
c.便利构造器最终必须调用一个指定构造器结束
(指定构造器总是向上代理,便利构造器总是横向代理)
5.3构造器的继承和重载
Swift中的子类默认不会继承父类的构造器,防止父类的简单构造被子类继承,并错误的创建子类的实例,如果希望子类能继承父类相同的构造器,需要定制子类的构造器
5.4指定构造器和便利构造器的语法
init(parameters){
statements
//便利构造器前置convenience关键字
@H_
502
_20@
convenienceinit(parameters){
class
Food{
name
:String
@H_
502
_20@
init(name:String){
self
.name
=name
convenienceinit(){
@H_
301
_276@self
.init
(name:
"[Unnamed]"
)
letnamedMeat=Food(name:
"Bacon"
)
//namedMeat'snameis"Bacon"
letmysteryMeat=Food()
//mysteryMeat'snameis"[Unnamed]"
class
RecipeIngredient
:Food{
quantity
:Int
@H_
502
_20@
init(name:String,0); background-color:inherit">quantity
:Int){
self
.quantity
=quantity
@H_
301
_276@super
.init
(name:name)
convenienceinit(name:String){
self
.init
(name:name,0); background-color:inherit">quantity
:
1
)
letoneMysteryItem=RecipeIngredient()
@H_
502
_20@
letoneBacon=RecipeIngredient(name:
"Bacon"
)
letsixEggs=RecipeIngredient(name:
"Eggs"
,0); background-color:inherit">quantity
:
6
)
ShoppingListItem
:RecipeIngredient{
@H_
502
_20@
varpurchased=
false
description
:String{
@H_
502
_20@
varoutput=
"\(quantity)x\(name.lowercaseString)"
output+=purchased?
"✔"
:
"✘"
@H_
301
_276@return
output
varbreakfastList=[
ShoppingListItem(),
@H_
502
_20@
ShoppingListItem(name:
"Bacon"
),
ShoppingListItem(name:
"Eggs"
,0); background-color:inherit">quantity
:
6
),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
]
breakfastList[
0
]
.name
=
"Orangejuice"
@H_
502
_20@
breakfastList[
0
]
.purchased
=
true
for
iteminbreakfastList{
@H_
502
_20@
println(item
.description
)
//1xorangejuice✔
//1xbacon✘
//6xeggs✘
6.通过闭包和函数来设置属性的默认值
属性可以使用闭包或全局函数来提供默认值,当创建新实例时,对应的闭包或函数就会被调用,返回值当做这个属性的默认值
//闭包结尾的大括号后接空得小括号,告诉Swift立刻执行此闭包,如果忽略这个括号,相当于闭包本身作为值赋给
属性
,而不是将闭包的返回值赋给
属性
class
SomeClass{
someProperty
:SomeType={
//createadefaultvalueforsomePropertyinsidethisclosure
//someValuemustbeofthesametypeasSomeType
return
someValue
@H_
502
_20@
}()
struct
Checkerboard{
boardColors
:Bool[]={
vartemporaryBoard=Bool[]()
@H_
502
_20@
varisBlack=
for
iin
1
..
.10
{
@H_
301
_276@for
jin
1
..
.10
{
temporaryBoard
.append
(isBlack)
@H_
502
_20@
isBlack=!isBlack
return
temporaryBoard
}()
@H_
502
_20@
funcsquareIsBlackAtRow(row:Int,0); background-color:inherit">column
:Int)->Bool{
return
boardColors[(
row
*
1
0
)+
column
]
letboard=Checkerboard()
@H_
502
_20@
println(board
.squareIsBlackAtRow
(
0
,0); background-color:inherit">column
:
1
))
//prints"true"
@H_
502
_20@
println(board
.squareIsBlackAtRow
(
9
,0); background-color:inherit">column
:
9
))
//prints"false"
@H_
301
_0@
析构过程 (Deinitialization)
类的实例被释放之前,析构
函数
被立即
调用
,deinit表示析构过程
1.原理
Swift会自动释放不需要的实例以释放资源,但当使用自己的资源的时候,需要清理额外的信息,如创建一个自定义的类来打开文件并写入数据,可能需要在类实例被释放之前关闭该文件
每个类组多只有一个析构函数,不允许主动调用,在实例被释放的前一步被自动调用,因为析构函数知道实例被释放才会被调用,所以可以访问实例的所有属性,并进行操作
deinit{
//performthedeinitialization
@H_
502
_20@
}
2.操作
struct
Bank{
static
varcoinsInBank=
1
0
_
0
0
0
@H_
301
_276@static
funcvendCoins(var
numberOfCoinsToVend
:Int)->Int{
numberOfCoinsToVend=min(numberOfCoinsToVend,coinsInBank)
@H_
502
_20@
coinsInBank-=numberOfCoinsToVend
return
numberOfCoinsToVend
@H_
301
_276@static
funcreceiveCoins(coins:Int){
@H_
502
_20@
coinsInBank+=coins
class
Player{
coinsInPurse
:Int
init(coins:Int){
@H_
502
_20@
coinsInPurse=Bank
.vendCoins
(coins)
funcwinCoins(coins:Int){
coinsInPurse+=Bank
.vendCoins
(coins)
deinit{
@H_
502
_20@
Bank
.receiveCoins
(coinsInPurse)
playerOne
:Player?=Player(coins:
1
0
0
)
@H_
502
_20@
println(
"Anewplayerhasjoinedthegamewith\(playerOne!.coinsInPurse)coins"
)
//prints"Anewplayerhasjoinedthegamewith100coins"
@H_
502
_20@
println(
"Therearenow\(Bank.coinsInBank)coinsleftinthebank"
)
//prints"Therearenow9900coinsleftinthebank"
@H_
502
_20@
playerOne!
.winCoins
(
2
_
0
0
0
)
println(
"PlayerOnewon2000coins&nowhas\(playerOne!.coinsInPurse)coins"
)
//prints"PlayerOnewon2000coins&nowhas2100coins"
println(
"Thebanknowonlyhas\(Bank.coinsInBank)coinsleft"
)
//prints"Thebanknowonlyhas7900coinsleft"
playerOne=
nil
@H_
502
_20@
println(
"PlayerOnehasleftthegame"
)
//prints"PlayerOnehasleftthegame"
@H_
502
_20@
println(
"Thebanknowhas\(Bank.coinsInBank)coins"
)
//prints"Thebanknowhas10000coins"
上一篇: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
外接键盘
流式标签