将函数转换为 Swift 3 的奇怪问题

Posted

技术标签:

【中文标题】将函数转换为 Swift 3 的奇怪问题【英文标题】:Strange issue on converting function to Swift 3 【发布时间】:2016-12-02 20:25:57 【问题描述】:

我在 Swift 2 中有一个函数:

public override func drawRect(rect: CGRect)

Xcode 提供将其转换为 Swift 3。我按下红点转换,它转换成:

open override func draw(_ rect: CGRect) 

但是,现在它给了我下一个错误:

Invalid redeclaration of 'draw'

如何正确地将其转换为 Swift 3?

【问题讨论】:

这是一个全局函数,还是一个类型的方法?另外,您是否已经检查过编译器所说的内容并查看同一范围内是否有另一个函数也具有类型签名draw(_:) @DanielHall it 类内部的方法。不,没有另一个 draw(_:) 编译器只显示我在这里发布的函数。 @Mighty Codder,您能否检查一下我提供的解决方案是否有效,我认为您正试图覆盖从 UIView 继承的类中的方法,不是吗? @Mighty Codder,也许你可以把整个班级的代码放在这里以供进一步参考? @lmiguelvargasf 它是从 NSUIView 继承的,我什至将其更改为 UIView。不幸的是,您的解决方案不起作用。 XCode 强制我在 func 前面添加 open 然后说无效的 draw 声明 【参考方案1】:

此代码(您的):

class MyView: UIView 
    open override func draw(_ rect: CGRect) 
        //
    

在这里编译得很好。

我怀疑您已经在课堂上实现了draw()

除此之外,清理和删除派生数据。

【讨论】:

@shalloThought,使用open的目的是什么? open 在这种情况下不是必需的。我只想说明最初发布的代码有效。在此答案中查找有关 open 访问级别的更多信息:***.com/a/40633441/1457385【参考方案2】:

Xcode 正确转换函数

open override func draw(_ rect: CGRect)

我认为你之前有同名的函数,当 Xcode 转换 drawRect 时,你现在有两个同名的函数。我现在自己尝试了,并且像上面那样声明绘图函数没有错误。但是,当声明这样的函数 2 次时会给出完全相同的错误。

【讨论】:

【参考方案3】:

假设你的班级是UIView,我认为你的方法签名应该只是:

override func draw(_ rect: CGRect)

它可以在 Swift 3 上运行。

【讨论】:

以上是关于将函数转换为 Swift 3 的奇怪问题的主要内容,如果未能解决你的问题,请参考以下文章

PFQuery 在 Swift 3 转换后没有运行

将 UTC 转换为本地时间会返回奇怪的结果

斯威夫特:奇怪的向下转换失败

ios swift将文本字段设置为数字键盘时会导致奇怪的错误

更新到 Xcode 9 / Swift 4 后 AVCapture 出现奇怪的编译错误 [重复]

NSManagedObjectContext 扩展中泛型函数中的奇怪 Swift 行为