Swift 1.2重新声明了Objective-C方法



我刚刚从swift 1.1更新到swift 1.2,并得到编译器错误:

Method 'setVacation' redeclares Objective-C method 'setVacation:'

这里有一些代码:

var vacation : Vacation?  
func setVacation(_vacation : Vacation)
{...}

但我需要呼叫setVacation

有什么建议可以解决这个问题吗?

这是由Xcode 6.3beta发行说明中所述的更改引起的:

Swift现在在中检测重载和重写之间的差异Swift型系统和通过Objective-C运行时。(18391046118383574)例如类中"property"的Objective-C setter与扩展中的方法"setProperty"现在被诊断为:

 class A : NSObject {
     var property: String = "Hello" // note: Objective-C method 'setProperty:’
                                    // previously declared by setter for
                                    // 'property’ here
 }
 extension A {
     func setProperty(str: String) { } // error: method ‘setProperty’
                                       // redeclares Objective-C method
                                       //'setProperty:’
 }

要解决此问题,您需要使所有方法签名都是唯一的(因为Objective-C不提供方法重载)

或者,如果您只需要Swift类,则不要从NSObject继承。

Cappy:对于Standford问题,我只使用了这个,因为它看起来像Xcode Beta只是简单地说操作:(Double,Double)->Double与操作:Double->Double相同,我不知道它是否是一个bug。。。

但下面的代码有效,但NOT干净:(

func performOperation(r:String? = "2", operation: (Double, Double) -> Double) {
    if operandStack.count >= 2 {
        displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
        enter()
    }
}
func performOperation(operation: Double -> Double) {
    if operandStack.count >= 1 {
        displayValue = operation(operandStack.removeLast())
        enter()
    }
}

正如@Kirsteins所指出的,Swift现在检测到Swift和Obj-C之间的冲突符号,以及会导致Obj-C悲伤的Swift符号。除了给出的答案之外,您还可以通过为其他类型指定所需的标签来避免这种情况,从而更改呼叫签名:

import Foundation
extension NSObject {
    func foo(d:Double, i:Int) { println("(d), (i)") }
    func foo(withInt d:Int, i:Int) { println("(d), (i)") }
}
let no = NSObject()
no.foo(withInt:1, i: 2)

除此之外,为了回答您的直接问题,您正在尝试将Obj-C习语应用于Swift。您真正想要的是实现didSet(很可能),或者可能实现set:

class WhatIDidLastSummer {
    var vacation:Bool = false {
        didSet {
            // do something
        }
    }
    var staycation:Bool {
        get { return true }
        set {
            // do something
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新