swift小点(2)

Selector

如果方法名称在方法所在域是唯一的,可以只是用方法的名字来作为#selector的内容

let someMethod = #selector(callMe)
let anotherMethod = #selector(callMeWithParam) 
let method = #selector(turn)

但如果再同一个作用域中存在同样名字的两个或多个方法 即使函数签名不同,也无法编译

@objc func commonFunc() {
}
@objc func commonFunc(input: Int) -> Int { 
   return input
}
let method = #selector(commonFunc) // 编译错误,`commonFunc` 有歧义

可以使用方法进行强制转换

let method1 = #selector(commonFunc as ()->()) 
let method2 = #selector(commonFunc as (Int)->Int)

实例方法的动态调用

class MyClass {
    func method(number: Int) -> Int {
        return number + 1
    }
}
let f = MyClass.method
let object = MyClass()
let result = f(object)(1)

只适用于实例方法 对于属性的getter和setter是不能用类似的方法

class MyClass {
     func method(number: Int) -> Int {
          return number + 1
      }
     class func method(number: Int) -> Int { 
          return number
      }
}
let f1 = MyClass.method
// class func method 的版本
let f2: (Int) -> Int = MyClass.method // 和 f1 相同
let f3: (MyClass) -> (Int) -> Int = MyClass.method // func method 的柯里化版

编译标记

// TODO: 未完成
// FIXME: 待修改
// MARK: 标记

@UIApplicationMain

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
    }
}

根据第三个参数初始化一个UIApplication或其子类的对象并开始接受事件(传入nil,意味使用默认的 UIApplication),最后一个参数指定了AppDelegate类作为应用的委托,被用来接受类似didFinishLaunching或者 didEnterBackground 这样的与应用生命周期相关的委托方法

虽然这个方法标明为返回一个int ,但是其实它并不会真正返回。它会一直存在于内存中,直到用户或者系统将其强制终止

在swift中 使用的是@UIApplicationMain
如果想使用自己的UIApplication 可以删除@UIApplicationMain 新建一个main.swift 特殊的文件

import UIKit
class MyApplication: UIApplication {
    override func sendEvent(event: UIEvent!) {
        super.sendEvent(event)
        print("Event sent: \(event)"); }
   }
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MyApplication), NSStringFromClass(AppDelegate))

每次发送事件 (比如点击按钮)时,都可以监听到这个事件

@objc 和 dynamic

swift中继承于NSObject的class会自动为所有非private的类和成员加上@objc

可选协议和协议扩展

OC中的protocol里存在optional关键字,被这个关键字修饰的方法并非必须要被实现,但是,Swift中的protocol的所有方法必须都被实现

Swift中若想protocol中实现可选项,那么就需要在协议和方法前面加上@objc,同时要在方法前加optional修饰表示可以选择是否实现

对于protocol来说 如果想每个方法都是可选的,需要每个方法前面加optional

 @objc protocol OptionalProtocol {
    @objc optional func optionalMethod() // 可选
    func necessaryMethod() // 必须
    @objc optional func anotherOptionalMethod() // 可选
}

对于使用@objc修饰的protocol只能被class实现,Struct和Enum无法实现,无法令Struct和Enum所实现的协议中含有可选方法或者属性,同时,实现这个协议的class中的方法必须是@objc修饰 或者整个类继承自NSObject

protocol OptionalProtocol {
    func optionalMethod() // 可选 
    func necessaryMethod() // 必须 
    func anotherOptionalMethod() // 可选
}
extension OptionalProtocol {
    func optionalMethod() {
        print("Implemented in extension")
    }
    func anotherOptionalMethod() {
        print("Implemented in extension")
    }
}
class MyClass: OptionalProtocol {
    func necessaryMethod() {
        print("Implemented in Class3")
    }
    func optionalMethod() {
        print("Implemented in Class3")
    }
}
let obj = MyClass()
obj.necessaryMethod() // Implemented in Class3
obj.optionalMethod() // Implemented inClass3
obj.anotherOptionalMethod() // Implemented in extension

内存管理,weak 和 unowned

unowned 设置以后即使它原来引用的内容已经被释放了,它仍然会保持对被已经释放了的对象的一个 "无效的" 引用,它不能是 Optional 值,也不会被指向 nil 。如果尝试调用这个引用的方法或者访问成员属性的话,程序就会崩溃。

因为weak引用的内容被释放之后,标记为weak的成员将会自动变为nil,所以,被weak修饰的变量尽量是optional值
建议

当能够确定在访问时不会被释放的话 尽量使用unowned
如果存在被释放的可能 就选择用weak

值类型和引用类型

Swift的类型分为值类型和引用类型

  • 值类型
    值类型被复制的时机是值类型的内容发生改变时
    值类型在复制时,会将存储在其中的值类型一并进行复制,而对于其中的引用类型的话 则只复制一份引用
  • 引用类型

1.在处理大量数据并且频繁操作(增删)其中元素时,选择NSMutableArray和NSMutableDictionary会更好
2.对于容器条目小而容器本身数目多的情况 选择Swift内建的Array和Dictionary

String 还是 NSString

1.Cocoa提供了足够多的操作String的方法
2.Swift中String是struct 通过配置常量赋值 在多线程编程时很重要.在不触及 NSString 特有操作和动态特性的时候,使用 String 的方法,在性能上也会有所提升
3.String实现了Collection协议 可以使用某些协议方法

UnsafePointer

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352