ios - `CountedSet` 初始化问题

标签 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

然后我将字符转储到一个数组中:

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/

相关文章:

xcode - [IOS SDK]-touchesBegan 以特定对象开始?

cocoa - NSArray 第三方子类保存原始值

c# - MonoTouch 的 QR 库?

ios - sqlcipher 在 iOS 10 中停止工作

ios - 如何正确地将 UITextField 添加到 UITableViewCell

ios - 在两个 UIViewController 之间使用 UIStoryBoardSegue 进行重复的 segue 处理

swift - 如何仅为一个特定的修改器更改应用动画?

objective-c - NSSet 到 NSArray 转换调用 objectAtIndex?

ios - Realm Swift 多用户登录

ios - 传递给另一个类时,NSString 的 id 返回 null