斯威夫特 2.1,xcode 7.2。简单的新手关于为啥它在 Playground 中有效但在应用程序中无效
Posted
技术标签:
【中文标题】斯威夫特 2.1,xcode 7.2。简单的新手关于为啥它在 Playground 中有效但在应用程序中无效【英文标题】:swift 2.1, xcode 7.2. simple NEWBIE about why it works in Playground but not in application斯威夫特 2.1,xcode 7.2。简单的新手关于为什么它在 Playground 中有效但在应用程序中无效 【发布时间】:2016-02-28 23:12:10 【问题描述】:此代码在 Playground 中有效,但是当我在 Xcode 7.2 的项目中定义此代码时出现编译错误
这是我的游乐场截图 https://goo.gl/yJ4Q75
错误是:方法没有覆盖超类中的任何方法
public class A
private func myUnavailableMethod()
print("A. private func myUnavailableMethod()")
public class B : A
override func myUnavailableMethod()
print("B. func myUnavailableMethod()")
在尝试覆盖方法时,此 Playground 的动机是一个错误,编译器抱怨为“不可用”
class MySFSafariViewController: SFSafariViewController
override init()
---- 发现他们如何将方法标记为不可用。
当跳转到 Objective C 声明时。
@interface SFSafariViewController : UIViewController
/*! @abstract The view controller's delegate */
@property (nonatomic, weak, nullable) id<SFSafariViewControllerDelegate> delegate;
****- (instancetype)init NS_UNAVAILABLE;****
【问题讨论】:
【参考方案1】:与其他一些语言相比,Swift 中私有/内部/公共的含义有所不同。
如果你在项目中有你的类作为两个单独的文件,那么它就很清楚了。
private - scope is visibility is the file that holds the code
internal - scope of visibility is the namespace
public - scope of visibility is full access from anywhere
在 Xcode Playground 中,它们都在一个文件中,因此该方法对 B 类可见。
【讨论】:
那么有没有办法将该方法标记为“对类外的任何东西都不可见”?我尝试了内部,它的行为与 Playground 中的私有相同 不,像你描述的那样保持它“类私有”的唯一方法是将它作为“文件的唯一占用者”,这将使该方法实际上对其他人不可见。 好吧,为了进一步扩展,我在下面的代码中看到了一个错误,并试图在 Playground 中模拟它。 所以这背后的动机是我在下面的 sn-p 中看到的一个错误。这会导致错误“无法覆盖已标记为不可用的 init。那么他们是如何做到的?”class MySFSafariViewController: SFSafariViewController override init() "【参考方案2】:A 类的myUnavailableMethod
是私有的,因此不能被覆盖。通过删除 private
关键字将方法声明更改为 internal
。
【讨论】:
但为什么 Playground 不抱怨呢? 顺便说一句,我知道 private 是什么意思 --- 因此方法命名为“myUnavailableMethod”以上是关于斯威夫特 2.1,xcode 7.2。简单的新手关于为啥它在 Playground 中有效但在应用程序中无效的主要内容,如果未能解决你的问题,请参考以下文章
斯威夫特 - UITableViewCell?不能转换为 UITableViewCell