美文网首页
swift3.0中fileprivate,private使用

swift3.0中fileprivate,private使用

作者: 黑色桃芯 | 来源:发表于2017-07-05 18:30 被阅读64次

    网上看了许多关于修饰符fileprivate,private的使用,结论后面说,下面是我测试的结果

    注:
    fileprivate(文件私有) 是 swift3.0引入的
    测试:xcode Version 8.3.3 / swift3.1

    • 研究
    • 1、private / fileprivate / private(set)
    • 2、private修饰后 extension中无法赋值

    创建两个类 分别为:
    FirstDog.swift
    SecondDog.swift

    代码:

    //FirstDog.swift
    class FirstDog: NSObject {
        //name属性 
        //不加任何修饰 本类和其他类都可以访问dogName
        var dogName : String = "fitstDog"
    
       //private绝对私有,其他类中不能访问,本类的extension中也不能访问,子类继承父类也不能访问
       // error:'dogName' is inaccessible due to 'private' protection level
       private var dogName : String = "fitstDog"
    
       //fileprivate是文件私有,一个文件是可以有多个类的,标记为fileprivate的常理在多个类里面都可以用。
       //换句话说,在当前FirstDog类 文件中 都可以使用,换成其他类不能使用,继承也不能使用
       //'dogName' is inaccessible due to 'fileprivate' protection level
       fileprivate var dogName : String = "fitstDog"
    
       //这个写法就是set方法私有
       //extension、继承、其他类,赋值dogName的操作都会报错
       //error:Cannot assign to property: 'dogName' setter is inaccessible 
       private(set) var dogName : String = "fitstDog"
    
        func temp1() {
            //不加任何修饰 本类、其他类、extension中 都可以访问dogName
            dogName = "fitstCat"
        }
    }
    
    //本类的 extension
    extension FirstDog {
        
        func temp2() {
            //修改
            dogName = "fitstCat"
            
            print(dogName)
        }
    }
    
    //FirstDog.swift
    // 本类FirstDog文件中的 另一个类ThirdDog
    // fileprivate是文件私有,一个文件是可以有多个类的,标记为fileprivate的常理在多个类里面都可以用,但如果标记为private,在不同类是不能访问的。
    class ThirdDog: NSObject {
        
        let fitstDog = FirstDog()
        
        func temp3() {
            //修改
            fitstDog.dogName = "thirdDog"
            
            print(fitstDog.dogName)
        }
    }
    
    
    //FirstDog.swift
    // 本类FirstDog文件中的 另一个类FourthDog 继承FirstDog
    //继承父类FirstDog 如果属性dogName设置为private 子类FourthDog是不能访问的
    class FourthDog: FirstDog {
        
        let fitstDog = FirstDog()
        
        func temp4() {
            //修改
            fitstDog.dogName = "thirdDog"
            
            print(fitstDog.dogName)
        }
    }
    

    SecondDog.swift

    import UIKit
    
    class SecondDog: NSObject {
        
        let firstDog = FirstDog()
        
        func temp() {
        
            print(firstDog.dogName)
            
            firstDog.dogName = "secondDog"
        }
    }
    

    ps:你也可以创建两个类,复制上面的代码,打开关闭 // 上面的dogName属性 尝试下

    总结:
    private私有,本类的extension、其他类、继承都不能使用
    fileprivate文件私有,本类文件内可以使用,文件外其他类、继承都不能使用
    private(set) set方法私有,不能修改

    参考:
    http://www.jianshu.com/p/604305a61e57
    http://www.jianshu.com/p/39853abd9f95

    相关文章

      网友评论

          本文标题:swift3.0中fileprivate,private使用

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