美文网首页swiftiOS面试
深入理解Swift中static和class关键字

深入理解Swift中static和class关键字

作者: 上帝也是码农 | 来源:发表于2019-04-25 18:55 被阅读0次

    static和class

    作用:这两个关键字都是用来说明被修饰的属性或者方法是类型(class/struct/enum)的,而不是类型实例的。

    static 适用的场景(class/struct/enum)

    • 修饰存储属性
    • 修饰计算属性
    • 修饰类型方法
    struct Point {
        let x: Double
        let y: Double
    //    修饰存储属性
        static let zero = Point(x: 0, y: 0)
    //    修饰计算属性
        static var ones: [Point] {
            return [Point(x: 1, y: 1)]
        }
    //    修饰类型方法
        static func add(p1: Point, p2: Point) -> Point {
            return Point(x: p1.x + p2.x, y: p1.y + p2.y)
        }
    }
    

    class 适用的场景

    • 修饰类方法
    • 修饰计算属性
    class MyClass {
    //    修饰计算属性
        class var age: Int {
            return 10
        }
    //    修饰类方法
        class func testFunc() {
            
        }
    }
    

    注意事项

    • class不能修饰类的存储属性,static可以修饰类的存储属性
    //class let name = "jack" error: Class stored properties not supported in classes; did you mean 'static'?
    
    • 在protocol中使用static来修饰类型域上的方法或者计算属性
    protocol MyProtocol {
        static func testFunc()
    }
    
    struct MyStruct: MyProtocol {
        static func testFunc() {
            
        }
    }
    
    enum MyEnum: MyProtocol {
        static func testFunc() {
            
        }
    }
    
    class MyClass: MyProtocol {
        static func testFunc() {
            
        }
    }
    
    • static修饰的类方法不能继承;class修饰的类方法可以继承
    class MyClass {
        class func testFunc() {
            
        }
        
        static func testFunc1() {
            
        }
    }
    
    class MySubClass: MyClass {
        override class func testFunc() {
            
        }
        
    // error: Cannot override static method
    //    override static func testFunc1() {
    //
    //    }
    }
    

    单例

    class SingleClass {
        static let shared = SingleClass()
        private init() {}
    }
    

    总结

    • static能修饰class/struct/enum的计算属性、存储属性、类型方法;class能修饰类的计算属性和类方法
    • static修饰的类方法不能继承;class修饰的类方法可以继承
    • 在protocol中要使用static

    参考

    相关文章

      网友评论

        本文标题:深入理解Swift中static和class关键字

        本文链接:https://www.haomeiwen.com/subject/mkctnqtx.html