Swift 1.2重新声明Objective-C方法

时间:2015-02-13 13:15:50

标签: swift properties redeclaration

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

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

这里有一些代码:

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

但我需要致电setVacation

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

3 个答案:

答案 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
        }
    }

}