मैं दो शब्दों में निहित पात्रों की तुलना कर रहा हूँ। इसे पूरा करने की कोशिश में, Set (उर्फ NSSet) इस कार्य को पूरा करने के रास्ते की तरह लग रहा था। मैंने पाया है कि यह मैचों पर झूठी सकारात्मक देता है, इसलिए मैं इसके बजाय CountedSet (उर्फ NSCountedSet) का उपयोग करने का प्रयास कर रहा हूं।

मैं बिना किसी समस्या के Set को प्रारंभ करने में सक्षम हूं, लेकिन मुझे CountedSet प्रारंभकर्ता काम करने के लिए नहीं मिल रहा है। यहाँ मैंने क्या किया है ...

मैं एक String से शुरू करता हूं:

// Let's say myTextField.text = "test"
let textFieldCharacters = myTextField.text?.characters
// word is a string from the ENABLE list of words
let wordCharacters = word.characters

फिर मैं पात्रों को एक Array में डंप करता हूं:

var wordCharactersArray = [Character]()
for character in wordCharacters {
    wordCharacterArray.append(character)
}


var textFieldCharactersArray = [Character]()    
for character in textFieldCharacters {
    wordCharacterArray.append(character)
}

फिर मैं चरित्र सरणियों से एक Set बना देता हूं:

let textFieldSet = Set<Character>(textFieldCharactersArray)
let wordSet = Set<Character>(wordCharactersArray)

अंत में, मैं यह देखने के लिए परीक्षण करता हूं कि क्या textFieldSet निम्नलिखित के साथ wordSet का सुपरसेट है:

textFieldSet.isSuperset(of: wordSet)

मेरे उदाहरण पर वापस जा रहे हैं, अगर myTextField.text "परीक्षण" है, तो मैं word के लिए मान लौटा रहा हूं, जिनके वर्ण wordSet के सुपरसेट हैं, लेकिन व्यक्तिगत तत्वों की गिनती नहीं है ' t myTextField.text के कैरेक्टर काउंट से मेल खाता है

अपनी समस्या पर शोध करने में, मुझे CountedSet (fka NSCountedSet) मिला है, जो मुझे लगता है कि मेरी समस्या का समाधान कर देगा। इसमें दो विधि हस्ताक्षर हैं:

public convenience init(array: [AnyObject])
public convenience init(set: Set<NSObject>)

मैंने वर्णों के 2 सेटों को प्रारंभ करने का प्रयास किया है:

let textFieldSet = CountedSet(array: textFieldCharacterArray)
let wordSet = CountedSet(array: wordCharacterArray)

मुझे सेट के लिए निम्न त्रुटि मिलती है:

प्रकार '[कैरेक्टर]' के मान को अपेक्षित तर्क प्रकार '[AnyObject]' में परिवर्तित नहीं कर सकता।

इसलिए मैंने इस तरह से सेट को इनिशियलाइज़ करने की कोशिश की:

let textFieldSet = CountedSet(array: textFieldCharacterArray as! [AnyObject])

जो निम्न त्रुटि उत्पन्न करता है:

'एनीऑब्जेक्ट' 'कैरेक्टर' का उपप्रकार नहीं है

मैंने विधि हस्ताक्षर के अनुसार CountedSet को Set के साथ प्रारंभ करने का भी प्रयास किया है, लेकिन जब मैं ऐसा करने का प्रयास करता हूं तो मुझे त्रुटियां मिलती हैं।

CountedSet को इनिशियलाइज़ करने के बारे में किसी भी सुझाव की बहुत सराहना की जाएगी।

0
Adrian 12 जुलाई 2016, 15:01
2
बस एक त्वरित समाधान विचार: चरित्र के बजाय स्ट्रिंग का उपयोग करें? उदाहरण के लिए, let textFieldCharacters = "test".characters.map { String($0) }; let textFieldSet = CountedSet(array: textFieldCharacters) को काम करना चाहिए।
 – 
Eric Aya
12 जुलाई 2016, 15:11
बहुत - बहुत धन्यवाद! यह 1 की कुंजी थी) मुझे सही रास्ते पर लाना और 2) मेरे कोड को कम करना।
 – 
Adrian
12 जुलाई 2016, 18:20

1 उत्तर

सबसे बढ़िया उत्तर

आप सही हैं कि यदि आपको न केवल तत्वों के उपहारों की बल्कि उनकी गिनती की भी तुलना करने की आवश्यकता है, तो आपको CountedSet का उपयोग करना चाहिए, जो कि स्विफ्ट 3.0 के लिए NSCountedSet का नाम बदल रहा है। आप जिस समस्या का सामना कर रहे हैं वह है CountedSet केवल उन तत्वों को स्वीकार कर सकता है जो ऑब्जेक्ट हैं और Characters नहीं हैं। जैसा कि एरिक डी अपनी टिप्पणी में बताते हैं, इससे बचने का सबसे आसान तरीका है अपने [Character] को [String] पर मैप करना जो [NSString] तक पहुंच जाएगा।

आप Set का उपयोग करके इस समस्या में नहीं चल रहे हैं, क्योंकि यह एक देशी स्विफ्ट संग्रह प्रकार है जो किसी भी प्रकार के तत्वों के साथ प्रारंभ होता है। यही कारण है कि आप Set को [Character] के साथ इनिशियलाइज़ कर सकते हैं।

अंतर देखने के लिए:

let word = "helo"
let wordCharacters = Array(word.characters)
let wordSet = Set(wordCharacters)
let wordCharStrings = wordCharacters.map{String($0)}
let wordCountedSet = CountedSet(array: wordCharStrings)

let textField = "hello"
let textFieldCharacters = Array(textField.characters)
let textSet = Set(textFieldCharacters)
let textFieldCharStrings = textFieldCharacters.map{String($0)}
let textFieldCountedSet = CountedSet(array: textFieldCharStrings)

textFieldCountedSet.isSubset(of: wordCountedSet as! Set<NSObject>) // returns false, but if word had two or more l's it would return true
textSet.isSubset(of: wordSet) // returns true
1
beyowulf 12 जुलाई 2016, 20:29
1
बहुत - बहुत धन्यवाद! मुझे इस लाइन wordCountedSet.isSubset(of: textFieldCountedSet as Set पर एक कंपाइलर त्रुटि मिली है। मैंने as को as! में बदल दिया और इसे इस चेतावनी के साथ काम करना पड़ा: "'काउंटेडसेट' से असंबंधित प्रकार 'सेट' में कास्ट करना हमेशा विफल रहता है"। मैंने कोड चलाया और चेतावनी के बावजूद यह काम किया।
 – 
Adrian
12 जुलाई 2016, 18:23