2017-01-24 73 views
1

我的項目轉換爲斯威夫特3之後,我得到這個消息:不明確使用 '價值'

不明確使用 '價值'

就行了

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

我想與使用擴展的NSObject實例關聯

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) 
     } 
    } 

這是我的ObjectWrapper類。

class ObjectWrapper : NSObject { 
    let value: Any 

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

遷移代碼之前一切都很好。什麼地方出了錯?

+1

可選項有'價值'成員嗎?它可能無法弄清楚你是否想要可選的成員,或者可選包裝的對象的成員。 – Carcigenicate

+0

@Carcigenicate沒有'價值'會員 – Ana

+0

@Hamish太棒了!只需重命名'value'屬性就可以解決問題。謝謝! – Ana

回答

1

的問題是,使用.value是模糊的斯威夫特,因爲這既可以指你的value財產,或任何NSObjectvalue(for...)家庭的鍵 - 值編碼方法。

我不相信有通過只使用雨燕的語法多義性這一個簡單的方法(假設你的value屬性的類型爲Any - 該方法也可以分型爲)。

雖然有趣的是,你可以實際使用的鍵 - 值編碼本身來獲取值:

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

但說實話,最簡單的解決辦法是隻爲了你的value屬性重命名爲其他(base也許?)。

+0

雖然如果它真的困擾你,你可以隨時[提交錯誤報告/改進](https://bugs.swift.org)抱怨說沒有簡單的方法通過使用Swift語法來消除歧義(實際上應該有*某種方式來做到這一點)。 – Hamish