`CountedSet`初始化问题

时间:2016-07-12 12:01:28

标签: ios swift nsset swift3 nscountedset

我比较两个单词中包含的字符。在寻求实现这一目标时,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是&#34;测试&#34;,则我返回word的值,其中wordSet的字符是myTextField.text的超集,但个别元素的数量与CountedSet

的字符数不匹配

在研究我的问题时,我发现了NSCountedSet(fka public convenience init(array: [AnyObject]) public convenience init(set: Set<NSObject>) ),我认为这会解决我的问题。它有两个方法签名:

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

我已尝试初始化两组字符,如下所示:

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

我为集合

收到以下错误
  

无法转换类型&#39; [字符]&#39;的值预期的参数类型   &#39; [AnyObject]&#39;

所以我尝试像这样初始化集合:

CountedSet

产生以下错误:

  

&#39; AnyObject&#39;不是&#39;字符&#39;

的子类型

我还尝试按照方法签名初始化Set CountedSet,但是当我尝试这样做时,我也会遇到错误。

任何有关如何初始化<html> <head> <title>jquery each test</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script> <script type="text/javascript"> var arr = ["One", "Two", "Three", "Four", "Five"]; var task = ""; $(document).ready( $.each(arr, function(index, value) { task += value + "<br>"; $('div.content').html(task); })); </script> </head> <body> <div class="content"></div> </body> </html> 的建议都将非常感谢。

1 个答案:

答案 0 :(得分:1)

你是正确的,如果你不仅要比较元素的呈现而且还需要比较它们的数量,你应该使用CountedSet,这是一个重命名为NSCountedSet的swift 3.0。您遇到的问题是CountedSet只能接受作为对象的元素而Characters不能接受。正如Eric D在他们的评论中指出的那样,解决这个问题的简单方法是将[Character]映射到[String],这将与[NSString]联系起来。

您没有使用Set遇到此问题,因为它是使用任何类型的元素初始化的本机Swift集合类型。这就是您可以使用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