#available()

函数来检查API函数的可用性

// 判断当前版本是否 iOS8.0+,OSX10.10+以及以其他平台
if #available(iOS 8.0, OSX 10.10, *) {
// 当版本匹配时
}
else
{
//当版本不匹配时
} 也可以放在方法前面, 使其方法在某个版本可用
// iOS8.0+,OSX10.10+以及以其他平台可用
@available(iOS 8.0, OSX 10.10, *)
func startUserActivity() -> NSUserActivity { }

新的guard语法:

这个新的语法允许你在一个代码周期中构建一个提前的退出点, 避免了大量的if 判断

如果 a >= b 就会进入else直接退出
guard a < b else { return }

optional

修饰 protocol时方法不用必须实现

强制展开(!)

如果对一个nil的optional 的变量进行强制展开(就是加上!), 会出现运行时错误, 所以如果对变量进行强制展开必须要保证Optional的变量不为nil

使用问号(?)来替代原来的叹号(!

if optionalChaining.string?.characters.count >  {

}

只有optionalChaining.string不为nil的适合才能访问characters

convenience

其内部一定要调用其同类的init方法完成初始化

注意: 子类不能重写这个方法或从子类中以super的方式调用, 子类一旦重写这个方法调用的init方法就会调用这个方法, 所以不需要重写

用法: 如果你想某些子类一定要调用某个初始化方法, 那么就可以在父类中加上一个convenience初始化方法, 这样子类每次创建对象的同时都会去调用这个init方法

    如果想强制子类一定调用这个方法, 可以结合required 修饰符在所调用的init方法前面加上required

required修饰符的使用规则

  1. required修饰符只能用于修饰类初始化方法。
  2. 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override
  3. 当子类没有初始化方法时,可以不用实现父类的required初始化方法。

    注意: 子类如果集成父类一定要在重写父类init方法时候调用[super init], swift强制这么做

protocol SomeProtocol {
init(someParameter: Int)
}
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
// 这里是构造器的实现部分
}
}

mutating

修饰方法能修改同实例属性值

协议 方法前面加上mutating 表示遵守协议的结构体 / 枚举能修改同实例属性

结构体/ 枚举中 方法要修改同实例属性需要在方法前面加上mutating, 表示你可以修改同实例属性

enum OnOffSwitch: Togglable {
case Off, On
mutating func toggle() {
switch self {
case Off:
self = On
case On:
self = Off
}
}
}
var lightSwitch = OnOffSwitch.Off
lightSwitch.toggle()
// lightSwitch 现在的值为 .On

typealias type

// 对原有类型, 声明一个新名称, 相当于以前的typedef

@testable

当你的应用程序包含单元测试 target 时,为了测试,测试模块需要访问应用程序模块中的代码。默认情况下只有public 级别的实体才可以被其他模块访问。然而,如果在导入应用程序模块的语句前使用 @testable 特性,然后在允许测试的编译设置(Build Options -> Enable Testability)下编译这个应用程序模块,单元测试 target 就可以访问应用程序模块中所有 internal 级别的实体。

fallthrough

用在swich case 中表示, 上下case 可以一起执行

__FILE__

当前文件路径

Defer 语句

defer 语句用于在退出当前作用域之前执行代码。

inout

传进去的参数直接可以修改, 就像传进去是地址, 地址对应的值被修改,调用的时候在变量前面加上&

deinit

析构函数, 相当于oc中dealloc

is

一般做判断使用

swift3.0

fileprivate  与 private

fileprivate 就是以前的 private 整个文件都能访问

private 现在是只能在当前class内部访问

如果在extention访问private的变量 会报variable is inaccessible due to 'private' protection level

open 与 public

现在swift 的变量作用域修饰符有如下几种(从高到低): open, public, fileprivate, private

open: 以前的public, 所有地方都能访问, 并且能重写, 能继承

public: 只能访问在module内部重写, 能访问. 继承

inout

inout作为函数声明时,引用传值的关键字。但是在调用的时候引用的是地址,所以在引用的时候要加上 &

override func viewDidLoad() {
super.viewDidLoad() var a =
var b =
var _ = test(a: &a, b: &b);
}
func test(a: inout Int, b: inout Int) -> Int{
return a + b
}

nonmutating

在声明值类型的实例为不可变变量,即let时,是不可以修改任何它内部的变量值的
struct TTTTStruct {
var name: String {
get {
return ""
} nonmutating set {
print(newValue)
}
}
} class TTClass2: TTClass {
override func ghjk() {
let sttttt = TTTTStruct()
sttttt.name = ""
name = ""
print(name)
}
}

associatedtype

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

Swift 特殊关键字 与符号的更多相关文章

  1. swift final关键字、?、!可选与非可选符

    ?符号: 可选型 在初始化时可以赋值为nil !符号:  隐形可选型 类型值不能为nil,如果解包后的可选类型为nil会报运行时错误,主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况.这主要 ...

  2. Swift - mutating关键字的使用

    转载自:http://www.jianshu.com/p/14cc9d30770a  感谢作者:此ID想了很久 Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用 ...

  3. Swift - defer关键字(推迟执行)

    在一些语言中,有try/finally这样的控制语句,比如Java. 这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪. 在Swift 2.0中,Apple提供了 ...

  4. Swift - final关键字的介绍,以及使用场景

    final关键字在大多数的编程语言中都存在,表示不允许对其修饰的内容进行继承或者重新操作.Swift中,final关键字可以在class.func和var前修饰. 通常大家都认为使用final可以更好 ...

  5. Swift之关键字使用(I)

    static和class的使用 static 使用 在非class的类型(包括enum和struct)中,一般使用static来描述类型作用域.在这个类型中,我们可以在类型范围中声明并使用存储属性,计 ...

  6. swift -inout关键字

    一般参数仅仅是在函数内可以改变的,当这个函数执行完后变量就会被销毁,不会有机会改变函数以外的变量,那么我们就会产生一个疑问,我们可不可以通过一个函数改变函数外面变量的值呢?答案是肯定的,这时我们就需要 ...

  7. 【Python系列】python关键字、符号、数据类型等分类

    https://github.com/AndyFlower/Python/blob/master/sample/python前言如下部分为python关键字,操作符号,格式字符.转义字符等,以后有时间 ...

  8. 关键字替代符号C++

    不知从什么时候的哪里我看到了一个and关键字,心想这是个什么玩意...然后知道它相当于&&,于是开启了罪恶的生涯-- 替代关键字,似乎可读性更好,但是有些编译器可能会无法识别(eg.M ...

  9. Swift的关键字

    在声明中使用关键字 let   :声明一个常量 var :声明一个变量 class :声明一个类 static :静态的 deinit :反初始化方法?析构方法 init :构造方法?初始化方法 en ...

随机推荐

  1. [洛谷P4962]朋也与光玉

    题目大意:有一张$n(n\leqslant100)$个点$m(m\leqslant n(n-1)$条边的有向图,每个点有一个颜色,需要找到一条长度为$k(k\leqslant13)$,恰好经过全部$k ...

  2. BZOJ4071 & 洛谷3644 & UOJ112:[APIO2015]巴邻旁之桥——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4071 https://www.luogu.org/problemnew/show/P3644 ht ...

  3. BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空 ...

  4. [Leetcode] powx n x的n次方

    Implement pow(x, n). 题意:计算x的次方 思路:这题的思路和sqrt的类似,向二分靠近.例如求4^5,我们可以这样求:res=4.4*4^4.就是将每次在res的基础上乘以x本身, ...

  5. Linux 第30天: (08月5日) 练习和作业

    变量脚本 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 server_ip=`if ...

  6. STL之五:set/multiset用法详解

    集合 转载于:http://blog.csdn.net/longshengguoji/article/details/8546286 使用set或multiset之前,必须加入头文件<set&g ...

  7. mysql绿色版安装,多实例安装

    1.为什么要装多个mysql多实例? 关于这个的原因,我目前了解为建立一个主数据库,一个或者多个从库,实现一主多从或者主从复制的目的. 2.设么是mysql的多实例? MySQL多实例就是在一台机器上 ...

  8. main函数的传参与返回

    1.谁给main函数传参(1)调用main函数所在的程序的它的父进程给main函数传参,并且接收main的返回值.2.为什么需要给main函数传参(1)首先,main函数不传参是可以的,也就是说父进程 ...

  9. Win7 安装配置 nexus3.7.1

    安装准备: nexus3.7.1 环境准备: maven.jdk 解压nexus目录结构为: E:\nexus-3.7.1-02 配置环境变量: 启动: nexus.exe /run

  10. 10.nginx+ffmpeg上搭建HLS切片

    1.首先介绍一下HLS协议: (1)简介 这个协议是由苹果公司提出并推广使用的,维基百科介绍如下: HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络 ...