每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词:
关键词:
用来声明的:
“ class,deinit,enum,extension,func,import,init,let,protocol,static,struct,subscript,typealias,var.”
用于子句的:
“ break,case,continue,default,do,else,fallthrough,if,in,for,return,switch,where,while.”
表达式和类型的:
“ as,dynamicType,is,new,super,self,__COLUMN__,__FILE__,__FUNCTION__,__LINE__”
//特殊语境使用的:
“didSet,get,inout,mutating,override,set,uNowned,uNowned(safe),uNowned(unsafe),weak,willSet”
class
用来定义一个类,相信大家并不陌生。
如果定义一个汽车类
- classCar
- {
- init()
- //todoinitsomething.
- }
- }
init
相对于类的构造方法的修饰。
deinit
相对于类的释构方法的修饰。
对于类的构造和释构在swift 中需要使用关键词来修饰,而很多高级语言并不需要特别的指定,便C++ 只需要类名与构造函数名相同就可以,不需要额外的关键词。
enum
枚举类型的声明,这个与很多语方都相通。
extension
扩展,有点像oc中的categories 。
Swift 中的可以扩展以下几个:
添加计算型属性和计算静态属性
定义实例方法和类型方法
提供新的构造器
定义下标
定义和使用新的嵌套类型
使一个已有类型符合某个接口
如下面扩展字符串:
- extensionString{
- struct_Dummy{
- varidxVal:Int
- var_padding:Int
- var_padding2:Int
- var_padding3:Int
- }
- //过虑出数字
- funcfitlerCharater()->String
- varnumberstr:String=""
- forcharacterinself
- {
- lets:String=String(character)
- //println(s.toInt())
- ifleths=s.toInt()
- numberstr+=character
- returnnumberstr
- //扩展使用下标访问
- subscript(i:Int)->Character{
- vardummy:_Dummy=reinterpretCast(i>=0?self.startIndex:self.endindex)
- dummy.idxVal+=i
- letidx:String.Index=reinterpretCast(dummy)
- returnself[idx]
- //扩展使用Range访问
- subscript(subRange:Range<Int>)->String{
- varstart:_Dummy=reinterpretCast(self.startIndex)
- varend=start
- start.idxVal=subRange._startIndex
- end.idxVal=subRange._endindex
- letstartIndex:String.Index=reinterpretCast(start)
- letendindex:String.Index=reinterpretCast(end)
- returnself[startIndex..endindex]
- }
测试:
- functestExtension()
- varstr:String="1234ab5国6cd7中8i90"
- println(str.fitlerCharater())
- letchina:String="chinaoperatingsystempublicto世界"
- println("使用下标索引访问第13个字符\(china[13])")
- println("使用负号下标即变为从右往左访问字符\(china[-1])")
- println("使用负号下标即变为从右往左访问字符\(china[-2])")
- println("使用下标Range来访问范围\(china[2...6])")
- dump(china[1..5],name:"china[1:4]")//使用dump输出
- dump(china[10...13],name:"china[10:13]")
- }
输出:
- 1234567890
- 使用下标索引访问第13个字符n
- 使用负号下标即变为从右往左访问字符界
- 使用负号下标即变为从右往左访问字符世
- 使用下标Range来访问范围inao
- -china[1:4]:hina
- -china[10:13]:atin
func
用来修饰函数的关键词。
import
导入头文件,相信大家都不陌生,但在swift 中好像被用来导入包,如import UIKit。 因为swift中没有了头文件的概念。
let
用来修改某一常量的关键词。像const 限定差不多
var
用来声明变量。
protocol
协议,也有称为接口,这个往往在很多高级语言中不能多重继承的情况下使用协议是一个比较好的多态方式。
static
用来修饰变量或函数为静态
struct
用来修饰结构体。
subscript
下标修饰,可以使类(class),结构体(struct),枚举(enum) 使用下标访问。
- classGarage
- varproducts:String[]=Array()
- subscript(index:Int)->String
- get
- returnproducts[index]
- set
- ifindex<products.count//&&!products.isEmpty
- products[index]=newValue
- else
- products.append(newValue)
-
@H_404_3@ @H_404_3@ @H_404_3@
- functestSubscript()
- vargarage=Garage()
- garage[0]="A"
- garage[1]="B"
- garage[2]="C"
- garage[3]="D"
- garage[2]="CC"
- println("index1=\(garage[0]),index2=\(garage[1]),index3=\(garage[2]),index4=\(garage[3])")
- }
输出@H_404_3@ @H_404_3@ @H_404_3@- index1=A,index2=B,index3=CC,index4=D
typealias
类型别名,就像typedef一样。借typedef unsigned long int UInt64同样在swift中也可能自定义类型。
break
跳出循环,通常用于for,while,do-while,switchcase
case相信大家并不陌生,常在switch中使用,但如今在swift中多了一个地方使用哪就是枚举类型。continue
跳过本次循环,继续往后执行。default
缺省声明。常见在switch中。do,while
这几个就不用多说了,越说越混。
in
范围或集合操作
@H_404_3@ @H_404_3@ @H_404_3@- letstr="123456"
- forcinstr
- println(c)
- }
由于swift中的switch语句中可以省去了break的写法,但在其它语言中省去break里,会继续往后一个case跑,直到碰到break或default才完成。在这里fallthrough就如同其它语言中忘记写break一样的功效。
@H_404_3@ @H_404_3@ @H_404_3@- letintegerToDescribe=1
- vardescription="Thenumber\(integerToDescribe)is"
- switchintegerToDescribe{
- case1,3,5,7,11,13,17,19:
- description+="aprimenumber,andalso";
- fallthrough
- case5:
- description+="aninteger"
- default:
- description+="finished"
- println(description)
输出:@H_404_3@ @H_404_3@ @H_404_3@- Thenumber1isaprimenumber,andalsoaninteger
where
swift中引入了where 来进行条件判断。
@H_404_3@ @H_404_3@ @H_404_3@- letyetAnotherPoint=(1,-1)
- switchyetAnotherPoint{
- caselet(x,y)wherex==y:
- println("(\(x),\(y))isonthelinex==y")
- )
- )
- }
当switch的条件满足where 后面的条件时,才执行语句。is
as
is 常用于对某变量类型的判断,就像OC中 isKindClass ,as 就有点像强制类型转换的意思了。
@H_404_3@ @H_404_3@ @H_404_3@- forview:AnyObjectinself.view.subviews
- ifviewisUIButton
- letbtn=viewasUIButton;
- println(btn)
- }
OC的写法:@H_404_3@ @H_404_3@ @H_404_3@- for(UIView*viewinself.view.subviews)
- if([viewisKindOfClass:[UIButtonclass]])//is操作
- UIButton*btn=(UIButton*)view//as操作
- }
super
基类的关键语,通常称父类__COLUMN__,__LINE__
是不是有点像宏定义啊。
@H_404_3@ @H_404_3@ @H_404_3@- println(__COLUMN__,__LINE__)
输出:@H_404_3@ @H_404_3@ @H_404_3@- (17,/Users/apple/Desktop/swiftDemo/swiftDemo/ViewController.swift,viewDidLoad(),62)
set,get常用于类属性的setter getter操作。
willSet,didSet
在swift中对set操作进行了扩展,willset 在set新值成功前发生,didset在设置新值成功后发生。inout
@H_404_3@ @H_404_3@ @H_404_3@- funcswapTwoInts(inouta:Int,inoutb:Int){
- lettemporaryA=a
- a=b
- b=temporaryA
- }
mutating
具体不是很理解,好像是专为结构体使用而设置的变体声明@H_404_3@ @H_404_3@ @H_404_3@- protocolExampleProtocol{
- varsimpleDescription:String{get}
- mutatingfuncadjust()
- classSimpleClass:ExampleProtocol{
- varsimpleDescription:String="Averysimpleclass."
- funcadjust(){
- simpleDescription+="Now100%adjusted."
- structSimpleStructure:ExampleProtocol{
- varsimpleDescription:String="Asimplestructure"
- mutatingfuncadjust(){//如果去除mutating报Couldnotfindanoverloadfor'+='thatacceptsthesuppliedarguments
- simpleDescription+="(adjusted)"
- }
@H_404_3@ @H_404_3@ @H_404_3@- functestMutating()
- vara=SimpleClass()
- a.adjust()
- letaDescription=a.simpleDescription
- println(aDescription)
- varb=SimpleStructure()
- b.adjust()
- letbDescription=b.simpleDescription
- println(bDescription)
- }
父子类之间的函数重写,即复盖。无宿主引用。
[uNowned self] 或[uNowned(safe) self] 或[uNowned(unsafe) self]
weak
弱引用,使得对象不会被持续占有
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。
相关推荐