Swift Tips笔记
例:
var level: Int?
var startLevel = var currentLevel = level ?? startLevel
//currentLevel等于默认值1
protocol TargetAction {
func performAction()
}
struct TargetActionWrapper<T:AnyObject>: TargetAction {
weak var target: T?
let action: (T) -> () -> ()
func performAction() {
if let t = target {
action(t)()
}
}
}
enum ControlEvent {
case TouchUpInside
case ValueChanged
}
class Control {
var actions = [ControlEvent: TargetAction]()
func setTarget<T:AnyObject>(target: T, action: (T) -> () -> (), controlEvent: ControlEvent) {
actions[controlEvent] = TargetActionWrapper(target: target, action: action)
}
func removeTargetForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent] = nil
}
func performActionForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent]?.performAction()
}
}
写一个可变参数的函数只需要在声明参数时在类型后面加上 “…”, 在同一个方法中只能有一个参数是可变的,可变参数都必须是同一种类型.
例:
“func sum(input: Int...) -> Int {
return input.reduce(, combine: +)
}
print(sum(,,,,))
// 输出:15”
如果有一个类型 Class 同时实现了 A 和 B接口(Protocol),为了避免冲突,在调用前应该进行类型转换。
例:
protocol A {
func bar() -> Int
}
protocol B {
func bar() -> String
}
class Class: A, B {
func bar() -> Int {
return
}
func bar() -> String {
return "Hi"
}
}
let instance = Class()
let num = (instance as A).bar() //
let str = (instance as B).bar() // "Hi"
Swift中常用的原生容器类型有Array、Dictionary、Set,它们都是泛型的,也就是说在一个集合中只能放同一个类型的元素。(OC可以用NSArray放不同类型的元素)
Swift可以考虑使用enum封装(利用enum可以带有值的特性)
代码如下:
enum IntOrString {
case IntValue(Int)
case StringValue(String)
}
let mix = [IntOrString.IntValue(),
IntOrString.StringValue("two"),
IntOrString.IntValue()]
mix.map { (obj) -> () in
switch obj {
case let .IntValue(i):
print(i)
case let .StringValue(str):
print(str)
}
}
Lazy修饰符和map、filter这类接受闭包的方法写在一起,让整个行为变成延时进行,在不需要完全运行,可能提前退出的情况下,可以优化性能。
代码如下:
let data = ...
let result = data.lazy.map {
(i: Int) -> Int in
print("正在处理 \(i)")
return i *
} print("准备访问结果")
for i in result {
print("操作后结果为 \(i)")
} print("操作完毕") /////// 输出结果
// 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕
Swift内建类型Array和Dictionary都是值类型,也就是在传递和赋值时会进行复制,而Cocoa中的NSMutableArray和NSMutableDictionary是引用类型。因此,在需要处理大量数据并频繁操作(增减)其中元素时,选择NSMutableArray和NSMutableDictionary更好,而对于容器内条目小而容器本身数目多的情况,选择Array和Dictionary更好。
GCD实现延时调用(delay)和取消执行(cancel)
实现代码:
typealias Task = (cancel: Bool) -> Void
func delay(time: NSTimeInterval, task:()->()) -> Task? {
func dispatch_later(block:()->()) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(time*Double(NSEC_PER_SEC))), dispatch_get_main_queue(), block)
}
var closure: dispatch_block_t? = task
var result: Task?
let delayedClosure: Task = {
cancel in
if let internalClosure = closure {
if (cancel == false) {
dispatch_async(dispatch_get_main_queue(), internalClosure)
}
}
closure = nil
result = nil
}
result = delayedClosure
dispatch_later { () -> () in
if let delayedClosure = result {
delayedClosure(cancel: false)
}
}
return result
}
func cancel(task:Task?) {
task?(cancel: true)
}
调用:
let task = delay(5.0, task: { print("Do sometiong 5 seconds later") }) //延迟5秒调用task
cancel(task) //取消执行task
Swift中如果想对属性进行KVO观察,需要添加dynamic关键字,如果无法修改源码,需要重载相关类。比起改写,更推荐使用swift第三方框架Observable-Swift
“class MyClass: NSObject {
var date = NSDate()
}
class MyChildClass: MyClass {
dynamic override var date: NSDate {
get { return super.date }
set { super.date = newValue }
}
}”
Swift实现Associated Object为已有类型添加属性
“class MyClass: NSObject {
var date = NSDate()
}
class MyChildClass: MyClass {
dynamic override var date: NSDate {
get { return super.date }
set { super.date = newValue }
}
}”
测试:
func printTitle(input: MyClass) {
if let title = input.title {
print("Title:\(title)")
}
else {
print("NO Title")
}
}
let c = MyClass()
printTitle(c)
c.title = "I'm title"
printTitle(c)
摘录来自: 王巍 (onevcat). “Swifter - 100 个 Swift 必备 Tips (第二版)”。 iBooks.
Swift Tips笔记的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- Swift的笔记和参考
原文:Swift的笔记和参考 好久没来了,趁着新语言Swift发布,继续钻研中! Create Class 创建类 (多态效果) // Create Class 创建类 class MyClass { ...
- 记录:swift学习笔记1-2
swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...
- Swift开发笔记
Swift开发笔记(一) 刚开始接触XCode时,整个操作逻辑与Android Studio.Visual Studio等是完全不同的,因此本文围绕IOS中控件的设置.事件的注册来简单的了解IOS开发 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记4——扩展、协议
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- AtCoder Tenka1 Programmer Beginner Contest 解题报告
赛时写了ABC,D实在没啥思路,然后C又难调...然后就从写完AB时的32名掉到了150+名 T_T 码力不够,思维不行,我还是AFO吧 比赛链接 A - Measure sb模拟,奇数串倒着输出偶数 ...
- 抽象类的继承,接口的实现,接口类型数组的使用,根据instanceof判断(返回)是否该是哪一个类型,类型的强转.
总觉得之前第2处有点问题,果然. 还需要instanceof判定一下,然后还需要把数组Animal[]转为Pet的才有方法play()~~~!
- hdoj-1005-Number Sequences
题目:Number Sequences 代码: #include<stdlib.h> #include<iostream> #include<cstdio> #in ...
- vscode中使用EF脚手架生成数据库上下文(scaffold-dbcontext)
目前在vscode上用netcore + ef core,在用dbfirst的方式生成模型和context上下文一直没有找到方法,之前在vs2017中,的nuget管理控制台输入命令: Scaffol ...
- yaml 文件保存
with open(mpath, "w") as f: yaml.safe_dump(yaml_dict,f,encoding='utf-8', allow_unicode=Tru ...
- 学以致用 ---- vue子组件→父组件通信
之前写过一篇关于 vue2.0中v-on绑定自定义事件 的随笔,但是今天实际应用的时候才发现根本就不理解,下面是实际工作中遇到的问题: [情景描述]页面中的[下拉搜索组件],因为多个页面中用到,所以抽 ...
- QString 编码转换
参考网址:http://blog.csdn.net/lfw19891101/article/details/6641785 (网页保存于:百度云CodeSkill33 --> 全部文件 > ...
- 对当前JAVA流行框架的一些小感悟
这几年,蹦出了不少各种JAVA框架,像是spring boot.spring cloud 和spring mvc或者是mybatis等等. 不断有人感慨,技术更新的太快,自己学都学不过来了. 但是,这 ...
- lambda表达式/对象引用计数
★lambda表达式的用法例:I=[(lambda x: x*2),(lambda y: y*3)]调用:for x in I: print x(2)输出:4,6 ★获取对象的引用次数sys.getr ...
- 8天掌握EF的Code First开发
C#高级知识点&(ABP框架理论学习高级篇)——白金版 http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent.html