如何在swift中声明一个'protected'变量

iPr*_*ram 29 encapsulation class swift swift3

我想创建一个继承自另一个类的类,该类位于不同的文件中.

例如:

Class1.swift

class Class1
{
    protected var 
    //Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

Class2.swift

class Class2:Class1
{
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在swift中有一个'保护'变量/函数?

当我声明一个私有变量/函数时,我只能在该类中使用它.如果我使用'fileprivate',我的其他类必须在保存文件中作为Class1.我想要做的是将我的类保存在seporate文件中,并使用Xcode中的Groups来了解哪个类属于哪个类别.

Kei*_*wan 42

你必须使用internal它,因为Swift不提供protected关键字(与许多其他编程语言不同).internalfileprivate和之间唯一的访问修饰符public:

内部访问使实体可以在其定义模块的任何源文件中使用,但不能在该模块之外的任何源文件中使用.在定义应用程序或框架的内部结构时,通常使用内部访问.

有一篇博客文章更多地解释了为什么语言设计师选择不提供protected关键字(或任何等价物).

一些原因是这样的

它实际上并没有提供任何真正的保护,因为子类总是可以通过新的公共方法或属性公开"受保护的"API.

以及在protected扩展时会引起问题的事实,因为扩展是否也应该有权访问protected属性并不清楚.


D4t*_*aya 6

即使Swift不提供protected访问权限,我们仍然可以通过使用fileprivate访问控制来实现类似的访问
我们只需要记住,我们需要在声明的父文件中将所有子文件声明在同一文件中。

动物迅捷

import Foundation

class Animal {
    fileprivate var protectedVar: Int = 0
}

class Dog: Animal {
    func doSomething() {
        protectedVar = 1
    }
}
Run Code Online (Sandbox Code Playgroud)

OtherFile.swift

let dog = Dog()
dog.doSomething()
Run Code Online (Sandbox Code Playgroud)

  • 问题是超类和子类必须位于同一文件中。这将是一个代码设计问题。 (11认同)

Fat*_*tie 5

对此类受保护的变量使用下划线:/

就是这样...

class RawDisplayThing {
    
    var _fraction: CGFloat = 0 {
        didSet { ... }
    }


class FlightMap: RawDisplayThing() {

    var currentPosition() {
        ...
        _fraction = 
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

每个人都必须“同意”只有概念类可以使用“_”变量和函数。

至少,在每个“_”项目上进行全局搜索并确保它只被超类使用是相对容易的。

或者,在这些概念之前加上“本地”、“显示”或类的名称(或任何对您的团队有意义的名称)。

class RawDisplayThing {
    
    var rawDisplayFraction: ...
    var rawDisplayTrigger: ...
    var rawDisplayConvolution: ...
Run Code Online (Sandbox Code Playgroud)

等等等等。也许它有帮助:/