Compiler error: Method with Objective-C selector conflicts with previous declaration with the same Objective-C selector

I myself am also taking the Standford course and I got stuck here for a long time too, but after some searching, I found something from here: Xcode release notes and it mentioned something below:

Swift 1.2 is strict about checking type-based overloading of @objc
methods and initializers, something not supported by Objective-C.

// Has the Objective-C selector "performOperation:".
func performOperation(op: NSOperation) { /* do something */ }
// Also has the selector "performOperation:".
func performOperation(fn: () -> Void) {
    self.performOperation(NSBlockOperation(block: fn))
}

This code would work when invoked from Swift, but could easily crash
if invoked from Objective-C. To solve this problem, use a type that is
not supported by Objective-C to prevent the Swift compiler from
exposing the member to the Objective-C runtime:

  • If it makes sense, mark the member as private to disable inference of @objc.
  • Otherwise, use a dummy parameter with a default value, for
    example: _ nonobjc: () = (). (19826275)

Overrides of methods exposed
to Objective-C in private subclasses are not inferred to be @objc,
causing the Swift compiler to crash. Explicitly add the @objc
attribute to any such overriding methods. (19935352)

Symbols from SDKs are not available when using Open Quickly in a
project or workspace that uses Swift. (20349540)

what i did was just adding “private” in front of the override method like this:

    private func performOperation(operation: Double -> Double) {
    if operandStack.count >= 1 {
        displayValue = operation(operandStack.removeLast())
        enter()
    }
}

Leave a Comment