斯威夫特 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 中有效但在应用程序中无效的主要内容,如果未能解决你的问题,请参考以下文章

消极时,斯威夫特加倍奇怪

具有动态大小内容的 UIScrollView

辅音和元音斯威夫特

斯威夫特 - UITableViewCell?不能转换为 UITableViewCell

Xcode 6 Beta / Swift - Playground 未更新

“使用未解析的标识符”我一生都无法弄清楚发生了啥。 (Xcode,斯威夫特)