我正在比较两个词中包含的字符。在寻求完成此任务时,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
然后我将字符转储到一个数组
中:
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($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
关于ios - `CountedSet` 初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38328346/