Ios开发:OC Swift
基本数据类型
整形Int
浮点型Double和Float
布尔型Bool
字符串型String
数组型Array
字典型Dictionary
元组Tuple
Let http = (404, “Not found”)
读取: 1.赋值法 2.下标访问法
可选类型Optional
var a : String ? = “Student”
“”
nil:对应存储空间没有数据
可选型就像一个盒子,如何打开这个盒子?(如何读取可选型数据?)
1.强制拆包 在可选型后加!
2.可选型绑定:lf let a = a {
//print(“a”)
}else{
Print(“该可选型为nil”)
}
3.nli聚合运算 var valueOfReward = a ?? “No Data”
集合
1.数组:Array<DateType> [DateType]
初始化:1.先声明空数组,然后逐步赋值 append()
2.声明时候赋值
var a : [int] = [ 1,2,3,4 ]
3.(repeating: ,count: int)
2.集合:Set<DataType> : 一组相同数据类型的元素组组成的,每个元素的值都唯一
3.字典:Dictionary<key:value>
初始化: var a = [Int : Int]()
Var a = [9:12,4:3]
JSON
{[
1 : 3
],[
5:”c”
]}
控制流:
条件结构:
If结构
Switch-case结构
循环结构
While/do while
for in 循环
for(int a = 1;a<= 6;a++)
var a : Int = 9
for value in a
for 起始值 in 结束值
遍历词典的方法:
For (a1,char)in a{
Print(a1)
}
函数func
关键词 函数名 (形参: 参数类型) -> 返回值的数据类型{
//TODO
return result
}
func name (a : int) -> int{
return a
}
函数的分类:
1.无参数f
func name () -> int{
return a
}
2.无返回值函数
func name (a : int) {
//TODO
}
3.多个返回值函数
func name (a : int) -> (int,int){
return a,b
}
4.可变形参函数
Func sum (numbers: Int ...) -> Int{
var result =0
for number in numbers{
result = result + number
}
return result
}
函数类型:
(Int,Int)-> (Int) intintint型
() - > () 相当于空元组
inout类型参数:
swift中两种参数传递方式:值类型 引用类型
值类型:调用参数过程中不会影响原始数据
引用类型:把参数本身的引用(内存地址)会影响原始数据
Swift中只有一种引用类型就是Class(类)
inout:让值类型以引用方式传递
eg:
func swap(a : inout Int , b : inout Int){
let temp = a
a = b
b = temp
}
var a = 5
var b = 6
swap(a : &a , b : &b)
print(“a is \(a),b is \(b)”)
tips: 1.inout 修饰的参数不能有默认值,有范围的参数值不能被inout修饰
2.一个参数一旦被inout修饰就不能被var或者let修饰,简言之,他们不能被称作是变量或者常量
第二部分 面向对象
一、闭包
闭包是一个功能性自包含模块,可以在代码中被当作参数传递或者直接使用,可以捕获和存储上下文中任意常量和变量的引用
分类:
-
- 全局函数:有名字但不会捕获任何值的闭包
- 嵌套函数:有名字可以捕获其封闭函数域内值闭包
- 闭包表达式:没有名字但可以捕获上下文变量和常量的值
嵌套函数和闭包表达式的区别:
- 嵌套函数是一种在复杂函数中命名和定义自包含代码块的简洁方式。
- 闭包表达式则是一种利用内联闭包的方式实现的更为简洁的方式。
闭包表达式:
定义:一段程序代码通常由常量、变量和表达式组成,之后使用一对花括号“{ }”来表示闭合并包裹着这些代码,由这对花括号包裹着的代码块就是一个闭包。
语法:
{
( 参数名1:参数类型,参数名2:参数类型… ) -> 返回值类型 in
闭包函数体
return 返回值
}
eg:
var theClose = {
(s1 : String, s2 : String) -> Bool in
return s1>s2
}
二、枚举类
enum Name{
case Value
}
枚举类名字必须以大写字母开头
三、类与结构体
结构体:struct a {
//TODO
}
类: class a {
//TODO
}
值类型是结构体,引用类型是类
引用类型的等价运算是“===”
四、属性
- 存储属性:存储在一个类或者结构体的变量或者常量
- 计算属性:经过计算后才能返回属性值àget,set方法
Get:通过计算属性的get方法来读取属性的值。
Set:计算属性的set方法可以根据计算属性的值来设置其他相关存储属性的值。
注意:计算属性的set方法是没有返回值的。
- 类型属性:一个类型的所有实例都共享的属性,用static标识
lazy:延迟存储属性,只有示例第一次调用时才会计算初始值
属性观察器;
willSet() 被改变前触发或调用
didSet() 属性值发生改变时触发或者调用
init(初始化):
eg:
class Student{
var name : String?
var age : Int?
init(name : String, age : Int){
self.name = name
self.age = age
}
}
五、方法 本质是一个函数
方法分为实例方法和类型方法。
- 实例方法与实例相关联,而类型方法与类型本身相关联,和该类型的实例无关。
- 类型方法是只能由类型本身调用的方法。通过在方法的前面加static实现的,在类型方法中,self指向类型本身,而不是类型
可变方法:mutating
下标方法 subscript
格式:
subscript ( index : Int ) -> Int {
get {
// return index
}
set ( newValue ) {
// set new value
}
}
六、类的特征:封装,继承,多态
继承:
1.每个子类只能有一个父类
2.类的继承没有深度限制
class son :father{
//TODO
}
没有父类的类叫基类
子类的多态性:编译器根据上下文判断一个子类示例应该表现为哪一个类是实例
重载:重写父类的方法
可以用super来引入父类的实现
语法:
override func a(){
//TODO
}
构造:init关键词
析构:deinit关键词
只有引用类型才有析构,类的实例使用结束后释放前,析构器才调用
语法: deinit{
//TODO
}
七、协议(接口)
protocol a{
//TODO
}
如何引用:
class Student :A {
}
关于权限:
{get,set}可读写的 {get}只读属性
如果类既有父类又有协议,那么父类写在协议的前面
八、范型
泛型是Swift的一个重要特征,它是一种适用于任何类型的可重用函数或类型,可以避免编写重复的代码。
1.泛型函数,是指函数中的参数可以是任何类型的。
在函数名后面加上“<T>”,表示类型名占位,用来替代具体的类型名。在函数的参数列表中,参数a和b的类型均为T,说明a和b是同一种类型,但具体是什么类型还不知道。
2.范型类:表示在定义阶段无法确定的一种类型,这个类型在类实例化的时候才能确定。
九、扩展
- 定义:
扩展就是向一个已有的类、结构体、枚举型或者协议增加新的功能。
- 扩展的内容:
添加计算型属性、添加实例方法和类型方法、添加新的构造器、添加下标等。
- 格式:
extension OldType {
new functions
}