2017-01-24 5 views
1

Nach meinem Projekt Swift Umwandlung 3, erhalte ich diese Meldung:mehrdeutige Verwendung von 'Wert'

mehrdeutige Verwendung von 'Wert'

Auf der Linie

let fetcher = wrapper?.value as? Fetcher<UIImage> 

Ich versuche, mit NSObject-Instanzen mithilfe von Erweiterungen

public extension UIImageView { 
    var hnk_fetcher : Fetcher<UIImage>! { 
     get { 
      let wrapper = objc_getAssociatedObject(self, &HanekeGlobals.UIKit.SetImageFetcherKey) as? ObjectWrapper 
      let fetcher = wrapper?.value as? Fetcher<UIImage> //Ambiguous use of 'value' 
      return fetcher 
     } 
     set (fetcher) { 
      var wrapper : ObjectWrapper? 
      if let fetcher = fetcher { 
       wrapper = ObjectWrapper(value: fetcher) 
      } 
      objc_setAssociatedObject(self, &HanekeGlobals.UIKit.SetImageFetcherKey, wrapper, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
zu verknüpfen

Hier ist meine ObjectWrapper-Klasse.

class ObjectWrapper : NSObject { 
    let value: Any 

    init(value: Any) { 
     self.value = value 
    } 
} 

Alles war gut vor der Migration des Codes. Was schief gelaufen ist?

+1

Haben Optionale ein 'value' Member? Es ist möglicherweise nicht in der Lage, herauszufinden, ob Sie das Element des optionalen Elements oder das Element des Objekts, das das optionale Wrapping enthält, möchten. – Carcigenicate

+0

@Carcigenicate Es gibt kein 'value' Mitglied – Ana

+0

@Hamish Great! Das Umbenennen der Eigenschaft 'value' hat das Problem behoben. Vielen Dank! – Ana

Antwort

1

Das Problem ist, dass die Verwendung von .value zu Swift zweideutig ist, da es entweder zu Ihrem value Eigentum oder zu einem NSObject ‚s value(for...) Familie von Methoden zur Schlüsselwert Codierung beziehen könnte.

ich nicht glaube gibt es eine einfache Möglichkeit, dies zu Disambiguieren von nur Swift-Syntax (vorausgesetzt, dass Ihre value Eigenschaft als Any eingegeben wird - was die Verfahren auch als eingegeben werden können).

Obwohl amüsante, können Sie tatsächlich verwenden Schlüsselwert Coding selbst den Wert zu erhalten:

let fetcher = wrapper?.value(forKeyPath: #keyPath(ObjectWrapper.value)) as? Fetcher<UIImage> 

Aber ehrlich gesagt, wäre die einfachste Lösung sein, nur Ihre value Eigenschaft, um etwas zu benennen andere (base vielleicht ?).

+0

Obwohl, wenn es dich wirklich stört, kannst du immer [einen Fehler melden/verbessern] (https://bugs.swift.org) sich beschweren, dass es keinen einfachen Weg gibt, dies zu disambiguieren, indem man einfach die Swift-Syntax verwendet (es sollte wirklich * irgendeine * Möglichkeit geben, dies zu tun). – Hamish

Verwandte Themen