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