5

'da kullanıldığında çağrılmadı. Swift/Objective-C birlikte çalışabilirliği ile ilgili garip bir sorunla karşılaştım. Durum:Swift sınıfında bildirilen "/" operatör yükü bazen Objective-C

Swift'de yazılmış bir @objc public class GKDistance:NSObject,NSCoding,Comparable sahibiyim.

public func <(a:GKDistance, b:GKDistance) -> Bool { 
    return a.value < b.value 
} 

public func ==(a:GKDistance, b:GKDistance) -> Bool { 
    return a.value == b.value 
} 

Daha sonra şöyle bir Objective-C yönteminde kullanılan:

if (distance < averageDistance){ 
    // code 
} 

Objective-C yöntemi olduğunda aşağıdaki gibi mesafeleri karşılaştırmak için, ben < için bir operatör aşırı eklemiş kullanıcı aşırı yüklendiğinde onaylamak için print() deyim ve kesme noktası < yönteminde ekleyebilirsiniz. Bir durumda, , Swift'da tanımlanan operatör aşırı yükünü gizemli bir şekilde atlar ve iki GKDistance nesnesi arasındaki düzenli Objective-C karşılaştırıcısını kullanır. distance.value == 2375.1842554877021 ve averageDistance.value == 75.671794891357421, distance < averageDistance getiri true ile çalıştırdığınızda

, Swift operatör aşırı çarptı ve Objective-C koşullu içinde kod çalıştırır asla.

Söz konusu Objective-C yöntemini Swift'e dönüştürürsem, beklendiği gibi davranır, ancak Swift'i göremeyen uygulamalarımızda çeşitli Objective-C yöntemlerinde diğer GKDistance karşılaştırmaları olduğundan endişe duyuyorum. operatör aşırı yükü.

Operatör aşırı yüklenme ile ilgili olduğu gibi, Swift/Objective-C birlikte çalışabilirliği ile benzer sorunları olan var mı?

cevap

2

Sizin

public func <(a:GKDistance, b:GKDistance) -> Bool { } 

- tüm Swift operatörler gibi - Objective-C ihraç edilmez bir üst düzey işlevi, ve üst düzey fonksiyonlar, içinde "Swift Tipi Uyumluluk" bkz "Interacting with Objective-C APIs". Ayrıca, 'un geçersiz kılma işleçlerini (Objective-) C içinde (<) yapamazsınız, bkz. Ör.

karşılaştırılır ve nesne distance ikamet tarafından işaret eğer koşul doğru olduğunda bir alt bellek adresiNesne işaretçisine göre, averageDistance tarafından yapılmıştır (ki bu sizin için ne amaçla tasarlandığını açık değildir). Yapabileceğin Ne

NSString veya NSNumber birine benzer sınıfınızda bir compare: yöntemi uygulamaktır.

Not Ayrıca NSObject alt sınıfları için, sen yerine == uygulanmasının isEqual: geçersiz

+1

Sana soru cevap var sanmıyorum karşılaştırmak gerekir. Amacı (C) 'yi Objective-C'ye aşırı yükleyemediğinizi anladığım halde, soru şu ki ... Swift'de bir operatöre aşırı yüklediğinizde, o zaman ObjC'den Swift köprüsüne bu işlevi çağırabilir. Objektif C'yi kullanabilir (çok yasal) Swift'de operatör aşırı yükü. Ayrıca, pozisyonunuzu haklı gösteren herhangi bir belgeye işaret edebilir misiniz? –

+1

@ColinPhillips: 'if (mesafe

+1

@ColinPhillips: Bazı referanslar ekledim. –