Swift 1.2 redeclares Objective-C метод

Я только что обновил с swift 1.1 до swift 1.2 и получил компилятор Error:

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

Вот код:

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

Но мне нужно позвонить setVacation

Есть ли какие-нибудь предложения, как это исправить?

Ответ 1

Это связано с изменением, указанным в примечаниях к выпуску Xcode 6.3beta:

Swift теперь обнаруживает расхождения между перегрузкой и переопределением в система типа Swift и эффективное поведение, наблюдаемое через Objective-C время выполнения. (18391046, 18383574) Например, следующее конфликт между установщиком Objective-C для "свойства" в классе и теперь метод "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 не обеспечивает перегрузку метода)

Или не наследуйте от NSObject, если вам нужен только класс Swift.

Ответ 2

Cappy: для проблемы Standford я использовал просто это, потому что похоже, что Xcode Beta просто говорит, что операция: (Double, Double) → Double - это то же самое, что и операция: Double → Double, я не знать, если это ошибка или нет...

Но приведенный ниже код работает, но НЕ clean: (

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()
    }
}

Ответ 3

Как отмечает @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
        }
    }

}