我刚刚从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
}
}
}