以后会自己总结学习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 Model
static 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学习 (一)的更多相关文章

  1. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  2. 今天开始Swift学习

    今天开始Swift学习  在此记录笔记  以备之后查阅! allenhuang

  3. iOS ---Swift学习与复习

    swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...

  4. 12套swift学习资源分享

    虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...

  5. Swift学习之常用UI的使用

    Swift学习之常用UI的使用 最近笔者在开始学习苹果最新的编程语言,因为笔者认为,苹果既然出了这门语言就绝对不会放弃,除非苹果倒闭了(当然这里知识一个玩笑). 所以在不久的将来,swift绝对是iO ...

  6. [转]swift 学习资源 大集合

    今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...

  7. swift 学习资源 大集合

    今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...

  8. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  9. swift学习:第一个swift程序

    原文:swift学习:第一个swift程序 最近swift有点火,赶紧跟上学习.于是,个人第一个swift程序诞生了... 新建项目

  10. swift学习 - 计时器

    swift学习之计时器 这个demo主要学习在swift中如何操作计时器(Timer),按钮(UIButton),文本(Label) 效果图: 代码 import UIKit class ViewCo ...

随机推荐

  1. 新闻系统——VS制作自己的模板

    我们在做机房管理的项目时,就用过模板方法,建立一个模板,这样就会省很多事,我们不需要每次都添加同样的东西,比如我们的类窗体,就可以制作一个模板,将注释和需要引用的控件直接添加上,这可以省去很大的麻烦, ...

  2. 【图文教程】CentOS 7配置静态IP地址

    文档目标:帮助新手在刚刚安装好的CentOS 7上设置静态IP地址. 目标人群:本篇教程比较简单,针对的是初学者,专业人士请跳过,不喜勿喷.谢谢! 在vmware中安装好centos7(安装过程省略) ...

  3. 前端学习笔记--Visual Studio Code安装及中文显示

    1.在官网https://code.visualstudio.com/下载对应的版本: 2.安装 一路点击下一步,选中  添加到PATH后,安装. 安装成功,可以直接打开使用: 把界面改成中文显示: ...

  4. H5--性能测试(PageSpeed Insights )

    中文网站(不需要翻墙): http://www.googlespeed.cn 主要可实现: 1.测试手机与电脑打开的速度对比. 2.详细的测试结果 3.直观的统计数据,查看页面的共xx个请求.总共大小 ...

  5. vue2 自定义过滤器

  6. 记录 ubuntu 安装中文语言出现 software database is broken

    在终端下执行 sudo apt-get install  language-pack-zh-han* 然后去语言中心设置中文,并全局使用即可.

  7. [Angular] Using Pipe for function memoization

    Sometimes we might have some expensive function to calcuate state directly from template: <div cl ...

  8. 5、创建RDD(集合、本地文件、HDFS文件)

    一.创建RDD 1.创建RDD 进行Spark核心编程时,首先要做的第一件事,就是创建一个初始的RDD.该RDD中,通常就代表和包含了Spark应用程序的输入源数据.然后在创建了初始的RDD之后,才可 ...

  9. ERROR: node with name "rabbit" already running on "localhost"

    rabbitmqctl start_app启动没有这个问题

  10. ios兼容

    border-radius在ios的兼容:-webkit-appearance:none;  加上这个属性,可以保证安卓和ios的圆角一致 上传图片,这段没有代码没有管图片拍摄的方位, var _th ...