我刚从swift 1.1更新到swift 1.2并得到编译错误:
Method 'setVacation' redeclares Objective-C method 'setVacation:'
这里有一些代码:
var vacation : Vacation?
func setVacation(_vacation : Vacation)
{...}
但我需要致电setVacation
有什么建议可以解决这个问题吗?
答案 0 :(得分:8)
这是由Xcode 6.3beta发行说明中所述的变化引起的:
Swift现在可以检测到重载和覆盖之间的差异 Swift类型系统和通过它看到的有效行为 Objective-C运行时。 (18391046,18383574)例如,以下内容 一个类中“属性”的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
。
答案 1 :(得分:4)
Cappy:对于Standford问题,我只使用了这个,因为看起来Xcode Beta只是说操作:( Double,Double) - > Double与操作相同:Double - >双,我不知道它是不是一个错误......
但下面的代码有效,但是不干净:(
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()
}
}
答案 2 :(得分:1)
如@Kirsteins所述,Swift现在可以检测到Swift和Obj-C之间的冲突符号,以及会导致Obj-C悲伤的快速符号。除了给出的答案之外,您通常可以通过为其他类型指定必需的标签来避免这种情况,从而更改呼叫签名:
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
}
}
}