关键字

@discardableResult

在Swift 2.x的时候,带返回的方法我们如果在调用的时候后面使用到返回的参数,编译器不会有任何的警告,想要编译器给出警告的话需要自己在方法前面添加属性 @warn_unused_result , 如

@warn_unused_result func doSomething() -> Bool {
  return true
}

这时候调用这个方法没有使用返回参数的情况下编译器就会给出警告:

Result of call to ‘doSomething()’ is unused

到了 Swift 3.0 我们不需要这样写了,默认情况下编译器就是会去检查返回参数是否有被使用,没有的话就会给出警告。如果你不想要这个警告,可以自己手动加上 @discardableResult ,如:

@discardableResult func doSomething() -> Bool {
  return true
}

@available

@available放在函数(方法),类或者协议前面。表明这些类型适用的平台和操作系统。看下面一个例子:

@available(iOS 9, *)
func myMethod() {
    // do something
}

@available(iOS 9, *)必须包含至少2个特性参数,其中iOS 9表示必须在 iOS 9 版本以上才可用。如果你部署的平台包括 iOS 8 , 在调用此方法后,编译器会报错。
另外一个特性参数:星号(*),表示包含了所有平台,目前有以下几个平台:

  • iOS
  • iOSApplicationExtension
  • OSX
  • OSXApplicationExtension
  • watchOS
  • watchOSApplicationExtension
  • tvOS
  • tvOSApplicationExtension

一般来讲,如果没有特殊的情况,都使用*表示全平台。

@available(iOS 9, *)是一种简写形式。全写形式是@available(iOS, introduced=9.0)introduced=9.0参数表示指定平台(iOS)从 9.0 开始引入该声明。为什么可以采用简写形式呢?当只有introduced这样一种参数时,就可以简写成以上简写形式。同理:@available(iOS 8.0, OSX 10.10, *) 这样也是可以的。表示同时在多个平台上(iOS 8.0 及其以上;OSX 10.10及其以上)的可用性。

另外,@available还有其他一些参数可以使用,分别是:

  • deprecated=版本号:从指定平台某个版本开始过期该声明
  • obsoleted=版本号:从指定平台某个版本开始废弃(注意弃用的区别,deprecated是还可以继续使用,只不过是不推荐了,obsoleted是调用就会编译错误)该声明
  • message=信息内容:给出一些附加信息
  • unavailable:指定平台上是无效的
  • renamed=新名字:重命名声明

#available

#available 用在条件语句代码块中,判断不同的平台下,做不同的逻辑处理,比如:

if #available(iOS 8, *) {
        // iOS 8 及其以上系统运行
}


guard #available(iOS 8, *) else {
    return //iOS 8 以下系统就直接返回
}

访问权限

从高到低排序如下:open >public> interal > fileprivate >private

  • private:所修饰的属性或者方法只能在当前类里访问
  • fileprivate: fileprivate访问级别所修饰的属性或者方法在当前的Swift源文件里可以访问。
  • interal: 默认访问级别,internal修饰符可写可不写)internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。internal可以省略,默认的访问限定就是internal。如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
  • public: 可以被任何人访问。但其他module中不可以被override和继承,而在module内可以被override和继承。
  • open: 可以被任何人使用,包括override和继承。

常量、变量、属性、下标索引的GettersSetters的访问级别继承自它们所属成员的访问级别。
Setter的访问级别可以低于对应的Getter的访问级别,这样就可以控制变量、属性或下标索引的读写权限。在var或subscript定义作用域之前,你可以通过private(set)internal(set)先为它门的写权限申明一个较低的访问级别。

defer

这里defer代码块会被压入栈中,函数结束时执行。到底啥时候执行呢?是在return后执行,如果return调用了其他函数,这个函数会在defer代码块执行之前被执行。

static 和 class

在类型的定义属性时,只能使用static,在定义类型的方法时,enumstruct只能用static, 类里面可以使用static,也可以使用class

inout

inout在写法上与C语言传递地址的写法十分类似,在调用函数传入参数是带有前缀&,就好像取地址传进去了一样,实则不然。

Swiftstruct 是值类型的。

何为值,值是不能改变的,是immutable的,任何对值的修改其实就是新构造了一个来替换原来的。这里的inout也是如此,并不是传了地址进来,而是在这里构造了一个新的结构体,当函数结束时会复制回去替换原来的结构体。

当然,这个复制并不一定会真的复制。Swiftcopy on write也会分情况,当值类型的引用只有一个时是不会复制的,这段在猫神的书里有提到。

associatedtype

associatedtype用于protocol中 associatedtype类型是在protocol中代指一个确定类型并要求该类型实现指定方法

比如 我们定义一个protocol

protocol Container {   
  associatedtype ItemType    
  mutating func append(_ item:ItemType)   
  var count:Int { 
    get
   }    
  subscript(i:Int) -> ItemType { 
    get
   }
}

之后实现这个协议

truct IntStack: Container {    
  // original IntStack implementation    
  var items = [Int]()

  mutating func push(_ item:Int) {        
    items.append(item)    
  }

  mutating func pop() -> Int {        
    return items.removeLast()    
  }    
  // conformance to the Container protocol 
  typealias ItemType = Int    
  mutating func append(_ item:Int) {        
    self.push(item)    
  }    
  var count:Int {        
    return items.count    
  }   
  subscript(i:Int) -> Int {        
    return items[i]    
  }
}

其中items实现了ItemType这个代指变量
由于swift的类型推断,你实际上并不需要声明一个具体ItemType的Int作为定义的一部分IntStack。由于IntStack符合所有的要求Container协议,swift可以推断出适当的ItemType使用,只需通过查看类型append(_:)方法的item参数和标的返回类型。事实上,如果你删除typealias ItemType = Int上面从代码行,一切仍然有效,因为很明显应该使用什么类型ItemType。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • Swift中关键字比较多,大部份刚开始学的时候看到这么多有点慌,初步整理一份,持续更新。 guard-- http...
    闻道刘阅读 313评论 0 0
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,450评论 0 4
  • 你想要的样子,你行动了吗?我的一个朋友说:“我想改变”,这几年我经常听她说这句话,今晚我又听到她说这句话!但我从来...
    大医美合伙人阅读 433评论 1 3
  • 去年年底,我们一家人和另外三家,组团去海南旅游。回来时我们是晚上七点的飞机。旅行团负责把我们送到机场。因头一天飞机...
    平淡是福济南阅读 437评论 0 0