`CountedSet` 初始化问题

`CountedSet` initialization issue

我正在比较两个词中包含的字符。在寻求完成此任务时,Set(又名 NSSet)似乎是完成此任务的方法。我发现它 returns 对比赛的误报,所以我试图使用 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 是 "test",我将返回 word 的值,其字符是 wordSet 的超集,但是单个元素的计数与 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)

我收到以下集合错误

Cannot convert value of type '[Character]' to expected argument type '[AnyObject]'.

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

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

这会产生以下错误:

'AnyObject' is not a subtype of 'Character'

我还尝试根据方法签名用 Set 初始化 CountedSet,但是当我尝试这样做时我也遇到了错误。

如有任何关于如何初始化 CountedSet 的建议,我们将不胜感激。

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

您不会 运行 使用 Set 解决这个问题,因为它是使用任何类型的元素初始化的本机 Swift 集合类型。这就是为什么你可以用 [Character].

初始化 Set

查看区别:

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

let textField = "hello"
let textFieldCharacters = Array(textField.characters)
let textSet = Set(textFieldCharacters)
let textFieldCharStrings = textFieldCharacters.map{String([=10=])}
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