Jak zauważyli @Kirsteins, Swift wykrywa teraz sprzeczne symbole pomiędzy Swift i Obj-C oraz szybkie symbole, które spowodowałyby żałobę Obj-C. Oprócz odpowiedzi udzielonej można tego uniknąć w ogóle, określając wymaganą etykietę dodatkowych typów, zmieniając w ten sposób sygnaturę połączenia:
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)
Poza tym, choć i odpowiedzieć na natychmiastowe pytanie, próbujesz zastosować idiomy Obj-C do Swifta. Co naprawdę chcesz, jest wdrożenie albo didSet
(najbardziej prawdopodobne), albo ewentualnie set
:
class WhatIDidLastSummer {
var vacation:Bool = false {
didSet {
// do something
}
}
var staycation:Bool {
get { return true }
set {
// do something
}
}
}
To pojawia się sugerować, że przeciążanie metod nie jest możliwe w takich klasach, jak UIViewControllers lub w istocie jakakolwiek klasa, która podklasuje dowolną klasę-c. Czy to jest poprawne? –
Wygląda na to, że czystym rozwiązaniem jest zadeklarowanie tych prywatnych. W ten sposób kompilator nie będzie próbował przekonwertować ich na ObjC, więc nie będzie konfliktu. – kwerle
@kwerle Niesamowite obejście. Nie myślałem o tym wcześniej. – Kirsteins