2015-11-19 32 views
1

我在Swift中构建了一个大类,我想分散在多个文件中,因为它变得太大而无法有效工作。它不能被子类化,因为它是只是一个有许多功能的课程。 (我可能能够稍后优化它,并删除双重代码,但我仍想实现此目的。)在多个文件中使用扩展名传播Swift-class

为了更容易工作我想使用扩展将该类传播到多个Swift文件。我已经部分实现了它;通过在同一文件中创建扩展来扩展基类。这工作没有任何问题。

可以说基本文件是BaseClass.Swift(类BaseClass的),我希望把它扩大到BaseClassExtension.swift,我把BaseClassExtension.swift如下:

extension BaseClass { 
    func doStuff() -> String { 
     return myVariable 
    } 
} 

BaseClass.swift我有private var myVariable = "I am a string",但在BaseClassExtension.swift我得到以下错误:使用未解决的标识符 'MYVARIABLE'

我曾尝试以下的事情:

  • 充分利用扩展公共
  • 充分利用BaseClass的公共
  • 使公共
  • (并且默认他们都默认(内部我猜?))

当我删除private from myVariable,错误已解决,但我真的希望它是私人的,因为它可能永远不会从课堂外直接访问。

+0

如果将'扩展BaseClass'更改为'extension BaseClassExtension:BaseClass',会发生什么? – JAL

+0

然后我得到以下错误:'使用未声明的类型'BaseClassExtension'。我认为这是有道理的,因为你不能扩展一个不存在的类。但这不是一个好的解决方案。 – JeroenJK

+0

没关系,我很困惑。你是对的。 – JAL

回答

2

您必须在与您的类相同的文件中创建扩展名,因为private仅限于此文件的范围。

但是你可以做这样的事情:

private(set) myVariable: String 

所以吸气可以从您的分机进行访问,但(至少)二传手仍隐藏于这个范围。

+0

感谢您的答案,但我想要使用扩展的全部原因是,我可以把它放在不同的文件。但是,如果这是不可能的,是否有另一种解决方案将我的课程分成多个文件,而我可以保持变量私人? – JeroenJK

+1

@JeroenJK无法在源文件之外访问它们。正如Swift的书中所说:“私人访问限制了实体对其自己定义的源文件的使用,使用私有访问来隐藏特定功能的实现细节。”想象一下,如果这是可能的,那么只有使用永远不会被访问的扩展名才能访问数组和字符串的内部变量。 – Qbyte

+0

我现在明白你为什么是对的。我会用这种方法。 – JeroenJK

相关问题