2015-10-05 7 views
27

यहाँ कोड है:'मेमे!' के प्रकार को परिवर्तित नहीं कर सकता उम्मीद तर्क प्रकार के '@noescape (मेमे) फेंकता है -> बूल'

@IBAction func deleteMeme(sender: UIBarButtonItem) { 
     if let foundIndex = MemeRepository.sharedInstance.memes.indexOf(selectedMeme) {  
     //remove the item at the found index 
     MemeRepository.sharedInstance.memes.removeAtIndex(foundIndex) 
     navigationController?.popViewControllerAnimated(true) 

त्रुटि (selectedMeme) पर .indexOf विधि में क्या होता है।

उम्मीद तर्क प्रकार @noescape (Meme) throws -> Bool

मेमे के प्रकार Meme! का मूल्य कनवर्ट नहीं कर सकता! मेरे ऐप के लिए एक संरचना है। मैं इसके माध्यम से कैसे काम करूं?

struct Meme { 

var topText : String! 
var bottomText: String! 
var image: UIImage! 
var memedImage: UIImage! 

init(topText: String, bottomText: String, image: UIImage, memedImage: UIImage) { 
    self.topText = topText 
    self.bottomText = bottomText 
    self.image = image 
    self.memedImage = memedImage 

उत्तर

44

त्रुटि संदेश भ्रामक है। आपको वास्तव में क्या चाहिए, संकलक को दो Meme उदाहरणों की तुलना करने का एक तरीका प्रदान करना है और यह तय करना है कि उन मानदंडों के मानदंड बराबर हैं।

मान लें कि आप दो उदाहरणों को समान name संपत्ति के बराबर माना जाना चाहते हैं।

हम struct Equatable के अनुरूप बनाने के लिए और हम भी एक == ऑपरेटर है कि उनके नाम संपत्ति से दो structs तुलना बनाएँ:

let doge = Meme(name: "doge") 

let lolcat = Meme(name: "lolcat") 

let memes = [lolcat, doge] 

if let dogeIndex = memes.indexOf(doge) { 
    print(dogeIndex) // 1 
} 
:

struct Meme:Equatable { 
    var name:String! 
} 

func ==(lhs: Meme, rhs: Meme) -> Bool { 
    return lhs.name == rhs.name 
} 

अब हम एक मेमे उदाहरण के साथ indexOf उपयोग कर सकते हैं

यदि आप दो उदाहरणों की तुलना अपनी name संपत्ति से नहीं बल्कि उनकी विशिष्टता से तुलना करना चाहते हैं, तो आपको संरचना को Hashable पर अनुरूप बनाना होगा और एक अद्वितीयका उपयोग करना होगाएक इंट लौटने संपत्ति:

struct Meme:Hashable { 
    var name:String! 
    var hashValue: Int { 
     return self.name.hashValue 
    } 
    init(name: String) { 
     self.name = name 
    } 
} 

func ==(lhs: Meme, rhs: Meme) -> Bool { 
    return lhs.hashValue == rhs.hashValue 
} 

let doge = Meme(name: "doge") 

let lolcat = Meme(name: "lolcat") 

let memes = [lolcat, doge] 

if let dogeIndex = memes.indexOf(doge) { 
    print(dogeIndex) // 1 
} 

इस उदाहरण hashValueself.name से बनाया गया है में, तो एक ही नाम के साथ संपत्ति मेमे के दो विभिन्न उदाहरणों बराबर विचार किया जाएगा। यदि आप यह नहीं चाहते हैं, तो हैश मान के लिए किसी अन्य स्रोत का उपयोग करें।

नोट: स्विफ्ट 3 में, indexOfindex(of:) बन गया है, तो यह उदाहरण के लिए हम को memes.indexOf(doge) बदल जाएगा।

+2

धन्यवाद। इसे हल करने का प्रयास करने में कठिन समय था। – nahwarang

+1

बिल्कुल सही जवाब। लेकिन यह अभी तक क्यों स्वीकार नहीं किया गया है? – BLC

+0

@ बीएलसी 2017 और यह अभी भी स्वीकार नहीं किया गया –

5

आप indexOf विधि के अंदर ही तुलना डाल करने के लिए चाहते हैं, तो इस तरह यह कार्य करें: चित्रों की तुलना करने के लिए

if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({ 
    UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)}) 

शायद नहीं सबसे अच्छा तरीका है। क्या आप जानते हैं छवियों का उद्देश्य एक ही हैं, तो आप उपयोग कर सकते हैं:

.indexOf({$0.memedImage == selectedMeme.memedImage}) 

लेकिन यदि आप उन्हें पिक्सेल द्वारा पिक्सेल तुलना या अलग अलग आकार के अनुसार आकार एक ही छवि की तुलना करना चाहते हैं, कि एक छोटे से अधिक जटिल है।

+0

आपके इनपुट और सहायता के लिए सभी को धन्यवाद। मैं समय और प्रयास की सराहना करता हूं। अगर आप इसे देखना चाहते हैं तो यहां मेरी परियोजना है: https://github.com/pbellot77/MemeMe.git –

संबंधित मुद्दे

 संबंधित मुद्दे