Swift学习 (三)
3.函数:
在Swift中函数的定义基本与OC一样。
主要区别为:
通过func关键词定义函数
返回值在->关键词后标注
各举一个类方法与实例方法例子。
1
2
|
+ (UIColor*)blackColor - (void)addSubview:(UIView *)view |
对应的swift版本
1
2
|
class func blackColor() -> UIColor //类方法, 通过 class func 关键词声明 func addSubview(view: UIView) //实例方法 |
在我们的项目中,经常会不断进行功能的增添。为了新增特性,许多方法在开发的过程中不断变动。举一个例子:我们开始有一个tableViewCell,它的设置方法一开始简单地需要一个Model参数:
1
|
func configureCellWithModel(Model: model) |
不久之后,我们想对部分Cell增添一个设置背景颜色的功能。方法需要再接收多一个参数:
1
|
func configureCellWithModel(Model: model,color:UIColor) |
这个时候方法改变,所以涉及到这些方法的地方都需要修改。给我们造成的困扰
一是:需要做许多重复修改的工作。
二是:无法做得很好的扩展和定制,有些地方的cell需要设置颜色,有些不需要。但是在OC里,我们只能对所有的cell都赋值。你可能觉得我们可以写两个方法,一个接收颜色参数,一个不接受。但是我们知道这不是一个很好的解决方法,会造成冗余的代码,维护起来也不方便。
而在Swift中,default parameter values的引入让我们能够这样修改我们的代码:
1
|
func configureCellWithModel(Model: model,color:UIColor = UIColor.whiteColor()) |
这样的改进能让我们写出的代码更具向后兼容性,减少了我们的重复工作量。
4.类与初始化(Initializers):
在Swift中,我们通过Access Control来进行控制公有和私有属性和方法。
properties, types, functions等能够进行版本控制的统称为实体。
Public:可以访问自己模块或应用中源文件里的任何实体,别人也可以访问引入该模块中源文件里的所有实体。通常情况下,某个接口或Framework是可以被任何人使用时,你可以将其设置为public级别。
Internal:可以访问自己模块或应用中源文件里的任何实体,但是别人不能访问该模块中源文件里的实体。通常情况下,某个接口或Framework作为内部结构使用时,你可以将其设置为internal级别。
Private:只能在当前源文件中使用的实体,称为私有实体。使用private级别,可以用作隐藏某些功能的实现细节
一个小技巧,如果我们有一系列的私有方法,我们可以把它们组织起来,放进一个extension里,这样就不需要每个方法都标记private,同时也便于管理组织代码:
1
2
3
4
5
|
// MARK: Private private extension ViewController { func privateFunction() { } } |
创建对象与alloc和init
关于初始化,在Swift中创建一个对象的语法很简洁:只需在类名后加一对圆括号即可。
1
|
var shape = Shape() |
在Swift中,initializer也与OC有所区别,Swift的初始化方法不返回数据。而在OC中我们通常返回一个self指针。
Swift的初始化方法让我们只关注对象的初始化。之前在OC世界中为什么要self = [super init]?。这种问题得以避免。Swift帮助我们处理了alloc的过程。也让我们的代码更简洁明确。
而在Swift中,init也有了更严格的规则。
对于所有Stored Properties,都必须在对象被创建出来前设置好。也就是我们必须在init方法中赋好值,或是直接给属性提供一个默认值。
如果有property可以被允许在初始出来时没有值,也就是需要在创建出来后再赋值,或是在程序运行过程都可能不会被赋值。那么这个property必须被声明为optional类型。该类型的属性会在init的时候初始化为nil.
initializer严格分为Designated Initializer和Convenience Initializer 并且有语法定义。
而在Objective-C中没有明确语法标记哪个初始化方式是convenience方法。关于Designated Initializer可参阅之前的:Objective-C 拾遗:designated initializer
1
2
3
4
5
6
7
|
init(parameters) { statements } convenience init(parameters) { statements } |
Swift学习 (三)的更多相关文章
- Swift学习三
http://blog.csdn.net/kuloveyouwei/article/details/36005299 Swift 提供两种集合类型来存储集合,数组和字典.数组是一个同类型的序列化列表集 ...
- Swift学习——使用if和switch来进行条件操作,使用for,while,和do-while来进行循环(三)
Swift学习--使用if和switch来进行条件操作,使用for,while,和do-while来进行循环 //switch支持随意类型的数据以及各种比較操作--不不过整数以及測试相等 //注意假设 ...
- iOS ---Swift学习与复习
swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...
- [转]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学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...
- Swift学习与复习
swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- 今天开始Swift学习
今天开始Swift学习 在此记录笔记 以备之后查阅! allenhuang
随机推荐
- WebStorm 安装
官方下载地址:https://www.jetbrains.com/webstorm/ 下载 安装 等待.......... 安装完成........................ 开始使用(第一次 ...
- 「CF319E」Ping-Pong「线段树」「并查集」
题意 规定区间\((a,b)\)到区间\((c,d)\)有边当且仅当\(c<a<d\)或\(c<b<d\). 起初区间集合为空.有\(n\)(\(n\leq 10^5\))次操 ...
- 如何将web转化成应用程序?
nativefier 最近无意中发现这个开源项目,Nativefier,看着它的项目介绍,以及1w+ 的 Star,感觉自己错过了一个世纪. 介绍 Nativefier是一个命令行工具,可以轻松地为 ...
- Python测试框架对比
如有任何学习问题,可以添加作者微信:lockingfree 更多学习资料请加QQ群: 822601020获取 unittest, pytest, nose, robot framework对比 什么是 ...
- Thread 相关函数和属性
t=Thread(target=func) # 启动子线程t.start() # 阻塞子线程,待子线程结束后,再往下执行t.join() # 判断线程是否在执行状态,在执行返回True,否则返回Fal ...
- 【MongoDB】查询字段对应的数组中包含某个值
在MongoDB操作的时候,我们可能会遇到查询[字段对应的数组中包含某个值]的数据,查询语句如下,假设表名为user. 示例1 数据 { id: 1, state_arr: [ "123&q ...
- Tkinter 之Text文本框标签
一.参数说明 语法 作用 t=tk.Text()t.insert(END,'插入的文本信息') INSERT:光标的插入点CURRENT:鼠标的当前位置所对应的字符位置END:这个Textbuffer ...
- Manjaro Linux无备份迁移home目录
前几天安装了最新的manjaro kde 18.10,速度刚开始非常快,后来几乎每次重启都会出现无法挂在home分区的情况,刚开始以为是分区对齐的问题,但是后来发现根本不是.算了,干脆迁移下home分 ...
- Spring|IOC与DI
一.IOC IOC(Inversion of Control),控制反转,是Spring的核心内容之一. 什么是“控制反转”? [示例] package com.my; /** * @Author j ...
- 20175234 2018-2019-2 《Java程序设计》第十周学习总结
目录 20175234 2018-2019-2 <Java程序设计>第十周学习总结 教材学习内容总结 12.1进程与线程 12.2 Java中的线程 12.3 Thread类与线程的创建 ...