Swift学习 (一)
以后会自己总结学习Swift的笔记与深化。希望能够帮助已经有Objective-C经验的开发者更快地学习Swift。我们一起学习,同时也品味到Swift的精妙之处。
结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感。
首先学习从Objective-C到Swift的语法差异。我们熟悉的Objective-C特性在Swift中如何展现:
1.属性(property)和实例变量(instance variable)
Objective-C property in Swift world
在Cocoa世界开发的过程中,我们最常打交道的是property.
典型的声明为:
|
1
|
@property (strong,nonatomic) NSString *string; |
而在Swift当中,摆脱了C的包袱后,变得更为精炼,我们只需直接在类中声明即可
|
1
2
3
|
class Shape { var name = "shape"} |
注意到这里,我们不再需要@property指令,而在Objective-C中,我们可以指定property的attribute,例如strong,weak,readonly等。
而在Swift的世界中,我们通过其他方式来声明这些property的性质。
需要注意的几点:
strong: 在Swift中是默认的
weak: 通过weak关键词申明
|
1
|
weak var delegate: UITextFieldDelegate? |
readonly,readwrie 直接通过声明常量let,声明变量var的方式来指明
copy 通过@NSCopying指令声明。
值得注意的是String,Array和Dictionary在Swift是以值类型(value type)而不是引用类型(reference type)出现,因此它们在赋值,初始化,参数传递中都是以拷贝的方式进行(简单来说,String,Array,Dictionary在Swift中是通过struct实现的)
nonatomic,atomic 所有的Swift properties 都是nonatomic。但是我们在线程安全上已经有许多机制,例如NSLock,GCD相关API等。个人推测原因是苹果想把这一个本来就用的很少的特性去掉,线程安全方面交给平时我们用的更多的机制去处理。
然后值得注意的是,在Objective-C中,我们可以跨过property直接与instance variable打交道,而在Swift是不可以的。
例如:我们可以不需要将someString声明为property,直接使用即可。即使我们将otherString声明为property,我们也可以直接用_otherString来使用property背后的实例变量。
|
1
2
3
4
|
@interface SomeClass : NSObject { NSString *someString;}@property(nonatomic, copy) NSString* otherString; |
而在Swift中,我们不能直接与instance variable打交道。也就是我们声明的方式简化为简单的一种,简单来说在Swift中,我们只与property打交道。
A Swift property does not have a corresponding instance variable, and the backing store for a property is not accessed directly
小结
因此之前使用OC导致的像巧哥指出的开发争议就不再需要争执了,在Swift的世界里,我们只与property打交道。
并且我们在OC中init和dealloc不能使用属性self.property = XXX来进行设置的情况得以解决和统一。
个人觉得这看似小小一点变动使Swift开发变得更加安全以及在代码的风格更为统一与稳定。
Swift property延伸:
在Swift中,property被分为两类:Stored Properties和Computed properties 简单来说,就是stored properties 能够保存值,而computed properties只提供getter与setter,利用stored properties来生成自己的值。个人感觉Computed properties更像方法,而不是传统意义的属性。但是这样一个特性存在,使得我们更容易组织我们的代码。
Swift提供了语言级别定义类变量的方法。
In C and Objective-C, you define static constants and variables associated with a type as global static variables.In Swift, however, type properties are written as part of the type’s definition, within the type’s outer curly braces, and each type property is explicitly scoped to the type it supports.
在Objective-C中,我们只能通过单例,或者static变量加类方法来自己构造类变量:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
@interface Model+ (int) value;+ (void) setValue:(int)val;@end@implementation Modelstatic int value;+ (int) value{ @synchronized(self) { return value; } }+ (void) setValue:(int)val{ @synchronized(self) { value = val; } }@end |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// Foo.h@interface Foo {}+(NSDictionary*) dictionary;// Foo.m+(NSDictionary*) dictionary{ static NSDictionary* fooDict = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ // create dict }); return fooDict;} |
而在Swift中我们通过清晰的语法便能定义类变量:
通过static定义的类变量无法在子类重写,通过class定义的类变量则可在子类重写。
|
1
2
3
4
5
6
7
8
9
|
struct SomeStructure { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 1 } class var overrideableComputedTypeProperty: Int { return 107 }} |
同时利用类变量我们也有了更优雅的单例模式实现:
|
1
2
3
4
|
class singletonClass { static let sharedInstance = singletonClass() private init() {} // 这就阻止其他对象使用这个类的默认的'()'初始化方法} |
延伸:目前Swift支持的type propertis中的Stored Properties类型不是传统意义上的类变量(class variable),暂时不能通过class 关键词定义,通过static定义的类变量类似java中的类变量,是无法被继承的,父类与子类的类变量指向的都是同一个静态变量。
|
1
2
3
4
5
6
|
class SomeStructure { class var storedTypeProperty = "Some value."}//Swift 2.0 Error: Class stored properties not yet supported in classes |
通过编译器抛出的错误信息,相信在未来的版本中会完善Type properties。
Swift学习 (一)的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- 今天开始Swift学习
今天开始Swift学习 在此记录笔记 以备之后查阅! allenhuang
- iOS ---Swift学习与复习
swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...
- 12套swift学习资源分享
虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...
- Swift学习之常用UI的使用
Swift学习之常用UI的使用 最近笔者在开始学习苹果最新的编程语言,因为笔者认为,苹果既然出了这门语言就绝对不会放弃,除非苹果倒闭了(当然这里知识一个玩笑). 所以在不久的将来,swift绝对是iO ...
- [转]swift 学习资源 大集合
今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...
- swift 学习资源 大集合
今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- swift学习:第一个swift程序
原文:swift学习:第一个swift程序 最近swift有点火,赶紧跟上学习.于是,个人第一个swift程序诞生了... 新建项目
- swift学习 - 计时器
swift学习之计时器 这个demo主要学习在swift中如何操作计时器(Timer),按钮(UIButton),文本(Label) 效果图: 代码 import UIKit class ViewCo ...
随机推荐
- 怎么区分PV、IV、UV
一:PV访问量(Page View),即页面访问量,每打开一次页面PV计数+1,刷新页面也是. 二:IP访问数指独立IP访问数,计算是以一个独立的IP在一个计算时段内访问网站计算为1次IP访问数.在同 ...
- Scrapy框架的八个扩展
一.proxies代理 首先需要在环境变量中设置 from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddlewa ...
- 远程jupyter+pycharm配置
前言 作为一个数据工程师,最喜欢的事情就是不停的在现实的服务端环境调试代码的参数.我们在本地的环境与生产的状况决然不同,我们一开始在本地写代码测试再部署到服务端的三板斧就不适用了. 最好的方式可以直接 ...
- 入门: 在Windows上搭建Flutter开发环境
使用镜像 由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中: export PUB_HOSTED_URL=htt ...
- 简要概述java内存模型,以及volatile关键字
如果我们要想深入了解Java并发编程,就要先理解好Java内存模型.Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步.原始的Java内存模型效率并不是很理想,因此 ...
- php面向对象之$this->用法简述
在成员方法中,调用成员方法的方法是对象名加方法名,格式就是“对象名->方法名”.但是在定义类的时候,我们往往不知道对象名是什么,所以就没法用对象名,这时,我们就要用到伪变量$this. 什么是$ ...
- 071_关闭 SELinux
#!/bin/bashsed -i '/^SELINUX/s/=.*/=disabled/' /etc/selinux/configsetenforce 0
- 拷贝和遍历DOM树
一.浅拷贝: 拷贝就是复制,就相当于把一个对象中的所有内容,复制一份给另一个对象,直接复制, 或者说,就是把一个对象的地址给了另外一个对象,他们的指向相同,两个对象之间有相同的属性或者方法,都可以使用 ...
- loj 2011
对于第 $i$ 天的询问前 $i - c - 1$ 天都会影响答案主席树维护 #include <iostream> #include <cstdio> #include &l ...
- ZROI Day6比赛总结
比赛还没结束而且我没有参加比赛就来这里了. T1 略 T2 设\(ans_d\)表示\(d|b_i\)的方案数(最后反演一下就可以) 设\(d\not|a_i\)的个数为\(l\)(可以\(O(n\l ...