`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
我正在比较两个词中包含的字符。在寻求完成此任务时,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