Swift中的一些关键字
以下关键字关于引用传参、属性、修改成员变量、静态变量、索引和构造函数重载
读过The Swift Programming Language的人都能看得出,我上面的这几个说法全不是apple的习惯用语。之所以这么起题目是因为很多最近转到swift下,但原本又不是搞ios开发的人,并不习惯apple的说法。他们经常在查询他人博客的时候因为某些名词的表示方式不同,而把原本简单的问题搞得一头雾水。就像我在刚接触oc的时候,很奇怪message和protocol的说法一样,因为我的mother programming language可以说是C#,我更接受parameter和interface的说法。
下面让我们用几个简单的keyword来解释一下swift中这几个可能会让你想几分钟,但本身又很简单的语法。
一、 in-out
这里in-out作为函数声明时,引用传值的关键字。相当于C#和Java中得ref和out。但是在函数调用的时候要写一个“&”符号在参数前面。
如下列代码:
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt =
var anotherInt =
swapTwoInts(&someInt, &anotherInt)
println("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
这是The Swift Programming Language中的实例,交换两个数的值。
二、 get set and willSet didSet
对于C#熟悉的人可以一眼看出get set是什么意思,就如下面代码所示,这种写法可以简化我们的工作:
struct AlternativeRect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / )
let centerY = origin.y + (size.height / )
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - (size.width / )
origin.y = newValue.y - (size.height / )
}
}
}
对于更简单而言我们还有@lazy的写法,用于属性在初始化之后才被赋值的情况。
class Head{
var eyes = "eyes"
var nose = "Nose"
}
class Arm{
var hands = "hands"
}
class Human{
@lazy var head = Head()
@lazy var arm = Arm()
} var human = Human()
var newhead = Head()
newhead.eyes = "blueeyes"
human.head = newhead
如果是protocol中声明一个属性,可以:
protocol SomeProtocol {
var mustBeSettable: Int { get set }
var doesNotNeedToBeSettable: Int { get }
}
其实这也比较像C#,以前的oc是不支持protocol中有属性的,仅仅是个方法列表。
willSet和didSet是两个非常好玩的东西。可以对属性赋值前和赋值后进行一定的操作:
class StepCounter {
var totalSteps: Int = {
willSet(newTotalSteps) {
println("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
println("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps =
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps =
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps =
// About to set totalSteps to 896
// Added 536 steps
这种方法对于写一个客户端app增加了极大的灵活性,把willSet和didSet封装到class中有助于我们更方便的控制对象的属性。
三、 mutating
这个关键字至少我是第一次见,他的作用是写在func前面,以便让func可以修改struct和protocol的extension中的成员的值。如果不加此关键字,成员值便被保护起来,不得修改。
例如:
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)
println("The point is now at (\(somePoint.x), \(somePoint.y))")
这让成员事实上面的更加的安全,因为在swift中没有private的概念。
四、 class var
在swift中对于enum和struct来说支持用static关键字来标示静态变量,但是对于class成员来说,只能以class var的方式返回一个只读值。如下:
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
// return an Int value here
}
}
enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
// return an Int value here
}
}
class SomeClass {
class var computedTypeProperty: Int {
// return an Int value here
}
}
这样其实很好的区分了struct和class的功能,不像C#抓来一个随便用,但相对于oc来讲其实是弱化了界限,如果你想在class中搞一个非只读的静态变量出来,可以和struct进行配合。
若想实现安全线程的单例模式,可以采用和struct结合的方式:
来源:http://blog.csdn.net/u010124617/article/details/28856711
class SwiftSingleton{
class func shareInstance()->SwiftSingleton{
struct YRSingleton{
static var predicate:dispatch_once_t =
static var instance:SwiftSingleton? = nil
}
dispatch_once(&YRSingleton.predicate,{
YRSingleton.instance=SwiftSingleton()
}
)
return YRSingleton.instance!
}
}
五、 subscript syntax
所谓subscript就是用[]来进行索引,这种语法十分灵活,可能借鉴了一些Python的风格。
如struct、array、dictionary都可以通过subscript进行索引:
struct Duden {
let offset:Int
var textCount:Int
subscript(index:Int) -> Int{
get{
return index - offset
}
set(newvalue){
textCount = newvalue *
}
}
} var duden = Duden(offset:,textCount:)
duden[] //7
duden[] = 8 //duden.textCount 24
六、 convenience
convenience用来进行方便的初始化,说白了就相当于构造函数重载,对于class来讲,默认或指定的初始化方法作为所谓的Designated初始化,若重载的初始化需要调用Designated初始化则将它作为convenience初始化,在方法前要加上convenience关键字。
class Figure{
var name:String!
var nikname:String?
init(){
name = "John"
}
convenience init(name:String!,nikname:String!){
self.init()
self.name = name
self.nikname = nikname
}
}
这个在涉及到继承的时候还有很多扩展,这里就不一一列举了。
http://www.wenjuan.com/s/77N7Jj
总之,这些新的关键字和新的特性都让这门新的语言变得灵活和安全。虽然初期会给你带了很多困惑和不便,但是你会很快爱上这门语言的。
欢迎访问倾剑飞血的博客:http://www.cnblogs.com/jacklandrin/p/3782831.html
Swift中的一些关键字的更多相关文章
- 一览Swift中的常用关键字
要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...
- Swift 中的利刃,函数和闭包
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- 27.怎样在Swift中声明typedef?
在OC中,我们经常会用typedef关键字来声明Block,例如: /** * 通用的空闭包类型,无参数,无返回值 */ typedef void (^GofVoidBlock)(void); 在Sw ...
- Swift中声明协议中的class关键字的作用
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在Cocos2D编程for Swift中看到以下一个代码片 ...
- swift学习笔记 - swift中常用关键字
swift中常用关键字 **用作声明的关键字: ** class.deinit.enum.extension.func.import.init.let.protocol.static.struct.s ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项
Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...
- 使用swift 中的注意,不断完善中
1. 应该充分利用swfit的新特性 比如如果按照oc里的习惯,调用一个delegate中都optional函数应该这样写 if delegate != nil && delegate ...
随机推荐
- linux下重启apache
基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/usr/local/apache2/bin/apachec ...
- sqlalchemy入门记录
前言 发现翻译全文时间比较久,所以先整个简单的使用说明吧 安装SQLAlchemy pip install sqlalchemy 查看SQLAlchemy版本 In [1]: import sqlal ...
- 【Beta】Scrum03
Info 时间:2016.12.01 21:30 时长:15min 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 NXT:2016.12.04 21:30 Task Report Name ...
- 手机端多种分享plugin插件地址
//qq cordova plugin add https://github.com/iVanPan/Cordova_QQ.git --variable QQ_APP_ID=app_id 参考文档 h ...
- BZOJ3168: [Heoi2013]钙铁锌硒维生素
设$A^TC=B^T$,这样$C_{ij}$表示$B_j$的线性表出需要$A_i$,那么$B_j$可以替换$A_i$,根据$C=(A^T)^{-1}B^T$求出$C$.要求字典序最小完美匹配,先求任意 ...
- 牛顿法|阻尼牛顿法|拟牛顿法|DFP算法|BFGS算法|L-BFGS算法
一直记不住这些算法的推导,所以打算详细点写到博客中以后不记得就翻阅自己的笔记. 泰勒展开式 最初的泰勒展开式,若 在包含 的某开区间(a,b)内具有直到n+1阶的导数,则当x∈(a,b)时,有: ...
- python 网络编程
一.网络知识的一些介绍 socket是网络连接端点.例如当你的Web浏览器请求www.pythontik.com上的主页时,你的Web浏览器创建一个socket并命令它去连接www.pythontik ...
- Emgu.CV 播放视频
using Emgu.CV; using System; using System.Drawing; using System.Threading; using System.Windows.Form ...
- .net 开源工作流比较及应用
送上比较内容图: 鉴于这个表的内容,与公司技术与需求的结合,我们选择啦RoadFlow工作流引擎. 下面踏上RoadFlow的征程. RoadFlow的下载.部署.及使用 官方网址:http://cq ...
- 学习MySQL之数据库操作(一)
所有代码,均为自学时用到的测试与注释,知识细节或知识点不会面面俱到,亦不会有任何讲解,只做为自己学习复习用. ##数据库操作 ##创建数据库 myTest ,并将数据库字符集设为GBK CREATE ...