2015-09-04 25 views
6

Używam 3rd ramy firmy, znajduje się plik zawiera następujący kod:Binary operator „==” nie mogą być stosowane do dwóch struct argumentów

struct AdServiceType { 
    init(_ value: UInt) 
    var value: UInt 
} 
var Internal: AdServiceType { get } 
var Normal: AdServiceType { get } 
var External: AdServiceType { get } 

class AdService : NSObject { 
    var serviceType: AdServiceType 
    init!() 
} 

Następnie w moim klasy projektu, mam

var aService : AdService? 

//aService is initialised 

//COMPILER ERROR: Binary operator ’==’ cannot be applied to two AdServiceType operands 
if aService!.serviceType == Normal { 
    //DO SOMETHING    
} 

mam błąd kompilatora wymieniony kiedy sprawdzić, czy serviceType jest Normal powyżej. Czemu? Jak się go pozbyć?

+0

To powinno być realizowane jako 'enum' zamiast. Teraz możesz porównać wartość 'serviceType.value' lub dostosować się do protokołu' Equatable' i dostarczyć niestandardową logikę porównania w celu użycia '==' na 'AdServiceType' – Alladinian

+1

@ iosDev82 Byłem sceptyczny co do tego, ale tak, myślę, że to czyni W końcu sens, więc go zaznaczyłem. Thanx – Alladinian

Odpowiedz

0

zorientowali się, że najprostszym rozwiązaniem jest porównanie wartości nieruchomości struct „s

if aService!.serviceType.value == Normal.value { 
    //DO SOMETHING. 
} 
0

Nie wiem szybko, ale o ile mogę zrozumieć Twoja struktura jest typem usługi, który jest obiektem typu AdService> Myślę, że musisz pobrać zmienną wewnątrz struktury, aby ta operacja dała przykład

myStruct{ 
int x 
int y 
} 

teraz warunek byłby ważny dla

myStruct obj1; 
obj1.x = 50; 
obj2.y = 40; 

if(obj.x == obj.y) coś takiego. Musisz uzyskać dostęp do wartości wewnątrz struktury, a nie samej struktury. Albo raczej przypisać operatora && dla (struct.x == struct2.x && struct.y == struct2.y) będzie całkiem dużo reprezentują values of struct == values of some other struct

-2

nie mam dużo wiedzy na temat swojej Thirdparty ram. Ale wiem, że niektóre typy nie używają "==", ale .equals. Na przykład:

if aService!.serviceType.equals(Normal) 

Może to powinno wystarczyć.

6

AdServiceType struct nie jest Equatable i nie może być używany jako wyrażenie switch. Ale jego value może. Spróbuj:

switch aService!.serviceType.value { 
case Internal.value: 
    //do something 
case Normal.value: 
    //do something 
case External.value: 
    //do something 
default: 
    ... 
} 

Alternatywnie, można przedłużyć AdServiceType dodanie wsparcia dla protokołu Equatable:

extension AdServiceType : Equatable {} 
public func ==(lhs: AdServiceType, rhs: AdServiceType) -> Bool 
{ 
    return lhs.value == rhs.value 
} 

i pozostawić przełącznik, jak to jest.

+0

Użyłem wartości i otrzymałem komunikat ERROR: Operator binarny "~ =" nie może być zastosowany do "AdServiceType" i "UInt" – user842225

+0

Czy korzystałeś wszędzie z wartości? Na linii przełączania i we wszystkich liniach przypadków? –

+1

Oh, użyłem tylko w linii przełącznika. Dzięki! Teraz jest dobrze! – user842225

-2

Po prostu zmień na klasę i nsobject, a potem z bólem.

class MyClass: NSObject { 

    //Write code in here 
} 
+0

Całkowicie się nie zgadzam, jedną z mocnych stron tego typu są typy wartości z użyciem struktur, więc powinieneś sprawdzić "Budowanie lepszych aplikacji z typami wartości w Swift" (https://developer.apple.com/videos/play/wwdc2015-414/) – marchinram

+0

jeśli nie będę w stanie używać == łatwo, to nie ma sensu. Tęsknisz również za wszystkimi innymi funkcjami narzędzia NSObject. – Esqarrouth

+0

Jeśli zamierzasz używać Swift, możesz równie dobrze napisać kod idiomatyczny, kiedy możesz .. – Jadar

0

bym go naprawić poprzez uczynienie struct Equatable:

extension AdServiceType: Equatable {} 

func ==(lhs: AdServiceType, rhs: AdServiceType) -> Bool { 
    return lhs.value == rhs.value; 
} 
Powiązane problemy