swift基础笔记(一)

464 阅读5分钟

  • 与结构体异同
/*相同点:
1.定义属性用于存储值
2.定义方法用于提供功能
3.定义附属脚本用于访问值
4.定义构造器用于生成初始化值
5.通过扩展以增加默认实现的功能
6.符合协议以对某类提供标准功能
*/
    
/*与结构体相比,类还有如下的附加功能
1.继承允许一个类继承另一个类的特征
2.类型转换允许在运行时检查和解释一个类实例的类型
3.解构器允许一个类实例释放任何其所被分配的资源
4.引用计数允许对一个类的多次引用
*/
  • 类的定义
class student {
         
}
  • 恒等运算符
1.运算符为:===
如果两个常量或者变量引用同一个类实例则返回 true
2.运算符为:!==
如果两个常量或者变量引用不同一个类实例则返回 true

结构体

/*Swift 结构体是构建代码所用的一种通用且灵活的构造体。我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。
与 C 和 Objective C 不同的是:
1.结构体不需要包含实现文件和接口。
2.结构体允许我们创建一个单一文件,且系统会自动生成面向其它代码的外部接口。
*/
    
///结构体定义
/*
struct StudentS {///Swift编译器自动为这个struct创建了一个初始化方法,这种init方法叫做Memberwise initializer
    var name: Int
    var age: Int
}
调用
let st = StudentS(name: 1, age: 2)
print(st.name)
如果有默认值 不用指定参数来初始化StudentS对象了
*/

/*结构体应用
在你的代码中,你可以使用结构体来定义你的自定义数据类型。
结构体实例总是通过值传递来定义你的自定义数据类型。
Bool,Int,Double,String,Array,Dictionary等常见类型都是结构体
结构体是值类型
*/

/*1.值类型
var a = 10
let b = a
a += 1
        
print(a,b)//11 10 a和b是指向不同的内存空间,并且直接将值存入其中,所以修改了其中一方并不影响另一方。 结论 值类型的特征:在变量的背后,值直接保存在变量指向的内存位置。
      
//2.引用类型
        
class Student {
    var name: String = 18
}

var s = Person()
var s1 = s
s1.name = "10"
s和s1指向同一个内存地址
*/

extension

  • 定义
/*extension
   1.定义
     扩展就是向一个已有的类、结构体或枚举类型添加新功能。
     扩展可以对一个类型添加新的功能,但是不能重写已有的功能。
   2.添加计算型属性和计算型静态属性、定义实例方法和类型方法、提供新的构造器、定义下标、定义和使用新的嵌套类型、使一个已有类型符合某个协议
    3.extension Type {
     // 加到SomeType的新功能写到这里
     }
*/
  • 举例
extension ViewController{
    func add() {
        print("666666666")
    }
}

extension Int
{
    var add : Int {
        return self+1
    }
}

extension Double {//结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样。
    mutating func square() {
        let per = 3.14
        self = per * self * self
    }
}

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //扩展
        self.add()
        
        let b =   5.add
        print(b)
        
        var a = 3.9
        a.square()
        print(a)//圆的面积
    }
}

协议

/*
协议能够继承一个或多个其他协议,可以在继承的协议基础上增加新的内容要求。
协议的继承语法与类的继承相似,多个被继承的协议间用逗号分隔:
协议规定了用来实现某一特定功能所必需的方法和属性。
类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。

写法:
protocol LifeServiceHeadClickDelegate: NSObjectProtocol {
    func clickWithIndex(index:Int)
}
protocol HomePlayDelegate {
    // 协议内容 属性必须指明是只读的还是可读可写的。
    var age: Int { get set }//set 写 get 读
    var name : String {get}//只读
}
     
要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔
class ViewController: UIViewController ,LifeServiceHeadClickDelegate{}
    
//可以在协议的继承列表中,通过添加class关键字,限制协议只能适配到类(class)类型。
protocol changeColor : UIView {
         
}
*/

Swift泛型

/*
Swift 的数组和字典类型都是泛型集。
可以创建一个Int数组,也可创建一个String数组,或者甚至于可以是任何其他 Swift 的类型数据数组。
     
泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可以起到占位符的作用,当类型暂时不确定的,只有等到调用函数时才能确定具体类型的时候可以引入泛型。
     
使用
// 定义一个泛型函数,把2个参数的值进行交换
func swapTwoValues<T>( first:inout T , second:inout T) {
    let temporary = first
    first = second
    second = temporary
}
*/

懒加载

private lazy var lineView : UIView = {
    let lineView = UIView()
    lineView.backgroundColor = UIColor(hexStr: "#EEEEEE")
    return lineView
}()

构造函数

//构造函数
/*1.定义
与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。
类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行清理内存的工作。
init(<#parameters#>) {
    <#statements#>
}
2.Swift 中的子类不会默认继承父类的构造器。
父类的构造器仅在确定和安全的情况下被继承。
当你重写一个父类指定构造器时,你需要写override修饰符。
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {}
override init(frame:CGRect){}
 */

继承、重写

1.继承
继承我们可以理解为一个类获取了另外一个类的方法和属性。

2.重写 override
子类可以通过继承来的实例方法,类方法,实例属性,或下标脚本来实现自己的定制功能,我们把这种行为叫重写(overriding)。
我们可以使用 override 关键字来实现重写。

子类中我们可以使用 override 关键字来重写超类的方法。
override func paly(){
    //paly 来自superclass   
}

我们可以使用 final 关键字防止它们被重写。
如果你重写了final方法,属性或下标脚本,在编译时会报错