0

我正在比较两个单词中包含的字符。在寻求实现这一目标时,Set(又名NSSet)似乎是完成这项任务的方法。我发现它在匹配时返回误报,所以我尝试使用CountedSet(aka NSCountedSet) 代替。

我能够Set毫无问题地初始化 a,但我无法让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,但单个元素的计数与 的字符计数不匹配myTextField.text

在研究我的问题时,我发现了CountedSet(fka NSCountedSet),我认为它可以解决我的问题。它有两个方法签名:

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

我试过像这样初始化两组字符:

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

我收到以下错误

无法将类型“[Character]”的值转换为预期的参数类型“[AnyObject]”。

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

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

这会产生以下错误:

“AnyObject”不是“Character”的子类型

我也尝试根据方法签名CountedSetSet, 初始化,但是当我尝试这样做时也会出错。

任何关于如何初始化 a 的建议CountedSet将不胜感激。

4

1 回答 1

1

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

使用 不会遇到这个问题Set,因为它是一个原生 Swift 集合类型,可以使用任何类型的元素进行初始化。这就是你可以用 初始化 aSet的原因[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
于 2016-07-12T13:18:25.650 回答