Swift中class,struct,enum,protocol 与 extension关系

338 阅读2分钟

说明

class

class:
1.可以创建存储属性,
2.可以创建计算属性且必须实现,
3.必须有初始化方法且初始化变量,
4.可以声明方法且必须实现

class-extension:
1.只可以创建计算属性且必须实现,
2.可以声明方法且必须实现

struct

struct:
1.可以创建存储属性,
2.可以创建计算属性且必须实现,
3.可以声明方法且必须实现

struct-extension:
1.只可以创建计算属性且必须实现,
2.可以声明方法且必须实现

enum

enum:
1.只可以创建计算属性且必须实现,
2.可以声明方法且必须实现

enum-extension:
1.只可以创建计算属性且必须实现,
2.可以声明方法且必须实现

protocol

protocol:
1.只可以创建计算属性且不可实现,
2.可以声明方法但不可实现

protocol-extension:
1.只可以创建计算属性且必须实现,
2.可以声明方法且必须实现

代码

import Foundation


class A_class{
    //可以创建存储属性
    let name:String
    //可以创建计算属性
    var name2:String{
        get{
            return "name"
        }
        set{
            
        }
    }
    //必须初始化且初始化变量,let修饰编译不会报错
    init(name:String){
        self.name = name
    }
    
    //可以声明方法且必须实现
    func done(){
        print("done")
    }
}

extension A_class{
    //只可以创建计算属性
    var nameE:String{
        get{
            return "nameE"
        }
        set{
            
        }
    }
    
    //可以声明方法且必须实现
    func doneE(){
        print("doneE")
    }
}

struct A_struct{
    //可以创建存储属性
    let name:String
    //可以创建计算属性
    var name2:String{
        get{
            return "name"
        }
        set{
            
        }
    }
    
    //可以声明方法且必须实现
    func done(){
        print("done")
    }
}

extension A_struct{
    ////只可以创建计算属性
    var nameE:String{
        get{
            return "nameE"
        }
        set{
            
        }
    }
    
    //可以声明方法且必须实现
    func doneE(){
        print("doneE")
    }
}

enum A_enum{
    //只可以创建计算属性
    var name:String{
        get{
            return "name"
        }
        set{
            
        }
    }
    
    //可以声明方法且必须实现
    func done(){
        print("done")
    }
}

extension A_enum{
    //只可以创建计算属性
    var nameE:String{
        get{
            return "nameE"
        }
        set{
            
        }
    }
    
    //可以声明方法且必须实现
    func doneE(){
        print("doneE")
    }
}

protocol A_protocol{
    //只可以创建计算属性且不可实现
    var name:String { get set }
    //可以声明方法但不可实现
    func done()
}

extension A_protocol{
    //只可以创建计算属性
    var nameE:String{
        get{
            return "nameE"
        }
        set{
            
        }
    }
    
    //可以声明方法且必须实现
    func doneE(){
        print("doneE")
    }
}