Swift:Class不能声明为public,因为它的Super类是内部的

时间:2016-12-07 07:10:06

标签: ios swift xcode swift3 access-specifier

我正在尝试将该类声明为公开,如下所示

class RewardsAndRedemptionModel:BaseObject {
var rewardHistory :[RewardHistoryModel]!
}

这是我试图让班级公开的地方,但我不能。

public class RewardHistoryModel :BaseObject  {
 var rewardValue : String!
 var recordedByName : String!
 var rewardFor : String!
}

即使我阅读了互联网上提供的文件我也无法理解,请帮助我。

3 个答案:

答案 0 :(得分:6)

编译器告诉您不能将其公开,因为超类是内部的。你知道,编译器并不撒谎。

没有子类比其超类更易于访问。为什么?以这种方式思考,子类具有其超类具有的所有属性和成员。如果这个限制不存在,那么访问修饰符将不再有用。你有一个内部课程。其他人将您的内部类子类化并将其声明为公共类。现在封装被打破了。现在可以通过子类访问您不想访问的内容。

换句话说,如果子类比其超类更易于访问,则超类的访问修饰符会失效。这就是为什么编译器有这个限制的原因:提醒你,你所写的内容可以使超级课程成为可能。访问修饰符失效。你可能做错了。

要解决此问题,请将BaseClass及其超类声明为公开。

答案 1 :(得分:3)

Swift 3

您需要声明RewardHistoryModel&的访问级别BaseObject课程&他们的内部成员喜欢函数或变量publicopen(在swift 3中可以使用)。

public class BaseObject {
   // set member of this class as public that you want to access outside (Project/Framework Level)
}

public class RewardHistoryModel :BaseObject  {
// set members as public or open  - // open is available in swift 3.
 public (or open) var rewardValue : String! 
 public (or open) var recordedByName : String!
 public (or open) var rewardFor : String!
}

如文档(The Swift Programming Language - Access Control)中所述:

  

公共变量不能定义为具有内部或私有   类型,因为类型可能无处可用   使用公共变量。

默认情况下,类被声明为内部,因此您必须添加public关键字以使其公开。

对于函数也存在类似的规则。

函数的访问级别不能高于其参数类型和返回类型,因为该函数可用于其组成类型不可用于周围代码的情况。

答案 2 :(得分:-1)

您还必须将BaseObject类声明为public