Swift 特殊关键字 与符号

摘要:
)如果强制展开nil的可选变量(即add!),则会出现运行时错误,因此如果强制展开变量,必须确保可选变量不使用问号表示nil(?当子类没有初始化方法时,您不需要实现父类所需的初始化方法。Swihcase中使用Fallthrough表示大小写可以在退出当前作用域之前执行__FILE__当前文件路径Defer语句Defer语句以执行代码。

#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 > 0 {
            
}

只有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 = 10
      var b = 20
      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 "123456"
        }
        
        nonmutating set {
            print(newValue)
        }
    }
}

class TTClass2: TTClass {
    override func ghjk() {
        let sttttt = TTTTStruct()
        sttttt.name = "4546"
        name = "1234"
        print(name)
    }
}

associatedtype

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

免责声明:文章转载自《Swift 特殊关键字 与符号》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++静态库与动态库(比较透彻)FastJSON反序列化学习下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Debug与Release的区别

  Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release  Buil...

1.golang数据类型,转换,变量类型检查,生命周期、闭包,打印方法,指针简介

golang是强类型,静态语言 1.golang 数据类型 布尔类型 true/false var b bool ,在golang底层bool不是1/0表示的 数值类型 :var i int =3 / var i:=3 数字在计算机内部是以二进制的方式存储的,二进制位就是一系列布尔值,取值要么为1,要么为0. 1位表示1或0,对于4位整数可以表示16个不同...

转 shell中字分隔的妙用:变量IFS

IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表符(tab) 以及新行(newline) 。先看下面一个简单示例: ? 1 2 3 4 5 6 7 8 #!/bin/sh msg="welcom...

PHP安全之register_globals

一、register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数. register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同。 <form action='' met...

JS基础知识1

基础点: es5 原型链、 2. 继承、 3. this指向、 4. new操作符、 5. 隐式转换、 6. 事件循环机制macro micro、 7. 基础类型、 8. 数据去重/交集/并集、 9. 判断是否为数组、 10. 变量声明提升、 11. 函数作用域、 12. 节流/防抖、 13.  apply/call、 14.  jsonp跨域、 15....

C#编程规范(个人使用)

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 1.1.1 类名、公开方法名、属性名使用Pascal 大小写形式; 例如:   public class HelloWorld   {   void SayHello(strin...