
swift
FreeBSFree
花有百样红,人与人不相同
展开
-
基本运算符
组合赋值运算符没有返回值//这种是错误的let b = a += 2两个对象判断是否是一个对象用 ===,!==来判断两个对象是否是一个对象,其实在判断内存地址.==和!=来判断基本数据类型class A { }class B { }var a = A()var b = B()var c = aif a === c { print(...原创 2019-06-25 10:36:48 · 141 阅读 · 0 评论 -
方法
类外叫做函数,它没和其他类型关联。类内叫做方法,它和特定类型关联了。方法分为类型方法和实例方法。每个实例方法都有一个隐士的属性self,不必去特意使用self,但是有时候为了避免歧义要用self。枚举体,结构体中的实例方法改变属性值默认枚举体,结构体中的方法是不能改变自身属性值的。如果枚举体或者结构体中的方法要改变自身的值那就在方法前用mutating关键字struct P...原创 2019-07-04 18:00:38 · 132 阅读 · 0 评论 -
类型转换
类型判断操作符==,!=判断俩个值类型是否相等===,!==判断两个引用是否是一个内存地址is判断某个对象是否是某个类型class MediaItem { var name: String init(name: String) { self.name = name }}class Movie: MediaItem { var ...原创 2019-07-10 11:57:59 · 110 阅读 · 0 评论 -
嵌套类型
struct BlackJackCard {enum Suit: Character {case spades = “♠”, hearts = “♡”, diamonds = “♢”, clubs = “♣”}enum Rank: Int { case two = 2, three, four, five, six, seven, eight, night, ten cas...原创 2019-07-10 15:00:21 · 342 阅读 · 0 评论 -
协议
协议语法protocol protocol1 { }protocol protocol2 { }class Test { }class Test1: Test, protocol1, protocol2 { }属性要求一定是var关键子的属性属性的名字要一致属性的类型要一致如果协议是get只读属性,那么协议的实现可以是只读属...原创 2019-07-15 14:09:38 · 167 阅读 · 0 评论 -
类,结构体,枚举类型比较总结
枚举类型枚举类型只有case,没有常量变量(不一样地方)可以有实例方法,类型方法。可以有指定构造器,没有便利构造器(不一样地方)可以有可变实例方法(不一样地方)它的原始值类型只有Int,Doublt, Float, Character类型,默认是Int类型,Character类型要赋初始值结构体结构体中只有let,var变量(不一样地方)可以有实例方法,类型方法。可以有...原创 2019-07-11 10:08:56 · 259 阅读 · 0 评论 -
扩展
扩展基础swift的扩展使用关键字extensionswift的扩展相当于OC的分类,即只能新增方法不能新增存储属性。extension Double { var km: Double { return self * 1000 } var cm: Double { return self / 100.0 }...原创 2019-07-11 11:07:31 · 198 阅读 · 0 评论 -
闭包
前言函数类型作为变量,可以接收函数。函数类型作为返回值, 可以返回函数。函数类型作为参数,这就是闭包。闭包闭包的写法有很多如果是尾随闭包,可以把闭包放到小括号的后边。如果这时候小括号里边没有参数了可以去掉小括号参数类型和返回类型可以省略参数可以省略用$0,$1表示如果是单一的表达式可以省略return关键字var a = ["2", "3", "1", "0", ...原创 2019-07-01 11:32:22 · 106 阅读 · 0 评论 -
内存安全
在inout参数的函数inout参数的变量会在函数内进行长期的写访问,如果在这个期间函数内部访问了外部的这个相同的内存将会报错,发生运行时的错误。解决办法1是在函数外将这个内存的值复制一份给两一个变量,这样在函数内部访问这个变量即可,因为现在访问的将会是另一个内存。解决办法2是在函数内部不访问外部的这个相同的内存,只是用传入的参数。// 报错示例var stepSize = 1...原创 2019-07-18 11:20:08 · 553 阅读 · 0 评论 -
泛型
泛型视图解决存储不同的数据类型,或者方法的入参是不同的数据类型。这样可以优雅的减少了很多不必要的重复代码。func exchangeTwoValue<T>(a:inout T, b: inout T){ let temp = a a = b b = temp}var a = 3var b = 4exchangeTwoValue(a: &a...原创 2019-07-16 11:18:39 · 118 阅读 · 0 评论 -
不透明类型
它是swift5.1新特性不透明类型可以将函数的返回类型进行隐藏。不透明的返回类型将更加灵活。不透明类型是反泛型。泛型是调用者知道具体哪个类型,但是不透明类型是模块的设计者才知道具体是哪个类型。不透明的返回类型要有统一的类型。// 1. 三角形protocol Shape { func draw() -> String}struct Triangle: Sha...原创 2019-07-16 16:00:46 · 665 阅读 · 0 评论 -
访问控制
访问控制修饰符open: 模块完全开放,在别的模块下可以进行继承后重写。public: 模块开放,在别的模块下不可以进行继承重写。internal: 只能在本模块内部使用。(默认)fileprivate: 只能在本文件内部使用。private: 只能在定义的作用域内使用。类型的访问权限会影响实体的访问权限open class a { var a = 3 // ...原创 2019-07-19 12:01:33 · 146 阅读 · 0 评论 -
自动引用计数
使用弱引用解决循环强引用如果两个变量属性都可以设置为nil,那么就用弱引用来设置其中一个属性来解决循环强引用。class Person { let name: String init(name: String) { self.name = name } weak var apartment: Apartment? deini...原创 2019-07-17 15:56:39 · 176 阅读 · 0 评论 -
属性
属性有存储属性,计算属性存储属性包括常量存储属性,变量存储属性常量存储属性特性如果一个值类型变量被声明为let,那么这个变量下的所有都是常量不可以改。如果是一个引用类型被定义为let,那么这个类型下的常量不可改变,变量依然可以改变。struct Size { var a = 0}class React { var area = 0.0}let siz...原创 2019-07-04 14:47:58 · 136 阅读 · 0 评论 -
错误处理
四种方式处理错误继续用throwing函数抛出错误(如果在一个方法内部不想处理错误,这时候想继续抛出错误可以用try去执行这个函数返回值类型是trows。)do,try,catch处理错误(一个函数可以在内部处理错误)将错误变为可选类型(想把抛出的错误转成可选类型,这时候用try?trowErrorMethod,它将会返回两种类型,一种是nil就是出错,还有一种是真正无错的返回值类型)...原创 2019-07-09 16:02:44 · 189 阅读 · 0 评论 -
字符串和字符
多行文本字串\ :续航符 \n :换行符 文本中可以随意使用各种符号例如双引号等。//多行文本字串let a = """0,1,2,3,4,5.one,two,three,four,five"""print("a = \(a)")//续行符let b = """0,1,2,3,4,5.\one,two,three,four,five"""print("...原创 2019-06-25 17:36:20 · 210 阅读 · 0 评论 -
swift速览
基本用法变量var a = 3var b: NSInteger? = 3var c: NSInteger?var d: NSIntegerd = 0数组字典var a = [1,2,3]var b: [Any?] = [4,5,"4"];var c = [String?]()var d = ["name":1, "type":2]var f: [String: ...原创 2019-06-22 16:52:34 · 144 阅读 · 0 评论 -
枚举类型
枚举的简单使用枚举,结构体,类的名字要大写它的名字可以被推断,所以第二次赋值时候之间可以省略枚举的名字。enum Direction { case north case south case east case west}var direction = Direction.northdirection = .east关联值枚举en...原创 2019-07-01 15:42:04 · 206 阅读 · 0 评论 -
集合类型
var a = [“1”:1, “2”:2, “3”:3]//1. 遍历获取key,valuefor (key,value) in a {print(“key = (key)—value = (value)”)}//2. 只是遍历keyfor key in a.keys {print(key)}//3. 只是遍历valuefor value in a.values {prin...原创 2019-06-26 16:43:30 · 158 阅读 · 0 评论 -
继承
子类可以访问继承下来的属性,方法,下标子类不可以重写存储属性。可以重写计算属性,方法,下标。当标记为static类型的类类型后不可以重写,当标记为class类类型的可以重写。子类可以为继承下来的存储属性和计算属性添加属性观察器。属性观察器不能重写。class clsSuper { var a = 0 { didSet { print("cl...原创 2019-07-08 09:16:52 · 115 阅读 · 0 评论 -
基础部分
如果你的代码中有不需要改变的值,请使用 let 关键字将它声明为常量。只将需要改变的值声明为变量var。在变量名后边加上冒号和空格来添加类型标注var red, green, blue: Double如果要在一行内执行多条语句要写分号分隔符let cat = "原创 2019-06-24 15:19:14 · 293 阅读 · 0 评论 -
构造过程
定义属性的三种方式直接赋初始值只写类型,在构造器中赋初始值当前是缺省值,以后一定有值。或者当前是缺省值,以后可能还是缺省值。class Test { //给属性赋默认值 var a = 0 //给属性类型,默认值在构造器中赋值 var b: Int //当前是缺省值, var c: Int?//当前是缺省值,以后可能还是缺省值 ...原创 2019-07-08 15:42:46 · 277 阅读 · 0 评论 -
析构器
析构器写法是deinit{}析构器是在类被销毁之前自动调用的一个方法。析构器不允许我们手动调动。析构器不允许显示调用父类的析构器。析构器不存在重写,也不用加override关键字。如果子类和父类同时都写了析构器,那么先调用子类析构器,在去调用父类的析构器。class Bank { static var coinsInBank = 10_000 class func r...原创 2019-07-08 17:33:17 · 295 阅读 · 0 评论 -
控制流
for infor in 跨度遍历var a = [1,2,3,4,5,6,7,8,9]for item in stride(from: 0, to: 8, by: 2){ print(a[item])}for item in stride(from: 0, through: 8, by: 2) { print(a[item])}While循环whil...原创 2019-06-27 17:21:59 · 131 阅读 · 0 评论 -
类和结构体
相同点都可以用变量属性存储值都可以用构造器初始化值都可以定义函数不同点类可以继承,结构体不能继承类有引用计数,结构体没有引用计数类是引用类型,结构体是值类型,结构体传递时候是值的拷贝结构体有成员逐一构造器,类没有简单使用struct Size { var width: Double = 0 var heigtht: Double = 0...原创 2019-07-03 14:34:29 · 213 阅读 · 0 评论 -
可选链
可选链就是有些对象是可选类型的,这时候用这个对象调用方法或者属性的时候如果强制解包会发生运行时错误。所以用可选?来调用。这样就是形成一个链式的调用。class Person { var residence: Residence? }class Residence { var roomCount = 1}let aPerson = Person()//aP...原创 2019-07-09 13:44:02 · 258 阅读 · 0 评论 -
下标
下标简单使用struct TimesTable { var muti = 1 subscript(index:Int) -> Int{ return index * muti }}var timesTa...原创 2019-07-12 17:06:23 · 1123 阅读 · 0 评论 -
函数
当没有定义返回值时候,其实也是反回了一个空元组return ()数组通过中括号中的下标访问字典通过中括号中的key访问元组通过点后边跟下标或者key访问默认值参数默认值参数要放到后边,把没有默认值的参数放到前边。默认值参数函数在调用时候可以不赋值,这时候会用默认值。也可以赋值,用我们赋的值。func hello(person: String, age: Int = 18){...原创 2019-06-28 14:05:42 · 128 阅读 · 0 评论 -
高级运算符
位运算符// 1. 按位取反运算符var a: UInt8 = 0b00001111var b = ~aprint(b,terminator:"\n\n")// 2. 按位与运算符var c = a & bprint(c,terminator:"\n\n")// 3. 按位或运算符var d = a | bprint(d,terminator:"\n\n")...原创 2019-07-20 11:18:12 · 497 阅读 · 0 评论