Ios 在Swift中作为整数的索引
我已经注释了以下代码:Ios 在Swift中作为整数的索引,ios,swift,Ios,Swift,我已经注释了以下代码: func hash (s:String) -> Int { var z = 19 let key = "abcdefghijk" for var i = 0; i < s.characters.count; i++ { let index = s.startIndex.advancedBy(i) let char = s[index] if let f = key.characters.
func hash (s:String) -> Int {
var z = 19
let key = "abcdefghijk"
for var i = 0; i < s.characters.count; i++ {
let index = s.startIndex.advancedBy(i)
let char = s[index]
if let f = key.characters.indexOf(char) {
print(f) //This outputs the number I want to use in the next line, but as String.CharacterView.Index, not an Int
z = (z * f) //obviously this won't work
}
// So instead we try this:
z = z * s.startIndex.distanceTo(key.characters.indexOf(char)!))
// It works for the first few characters then I get "fatal error: can not increment endIndex" and a EXC_BAD_INSTRUCTION
}
return z
}
func散列(s:String)->Int{
var z=19
let key=“abcdefghijk”
对于变量i=0;i
我正在努力使用SwiftString
来查找我想在某种散列函数中用作Int
的索引。如果不清楚:
用户输入一个字符串,函数遍历每个字符,在键中找到该字符,然后在键中获取该字符的索引,并将其乘以现有的z
计数器
我得到了我想要的结果,但只是错误的类型,不允许我转换为Int。有人知道怎么做吗
谢谢f=key.characters.indexOf(char)
是字符的索引
对于键
,因此您必须计算到键
起始索引的距离,而不是s
:
z = z * key.startIndex.distanceTo(key.characters.indexOf(char)!))
如果让
阻塞,您可以将其移回您的:
if let f = key.characters.indexOf(char) {
z = z * key.startIndex.distanceTo(f)
}
您可能还想使用&*
if let f = key.characters.indexOf(char) {
z = z &* key.startIndex.distanceTo(f)
}
否则,如果
乘法不适合于Int
通常,只能使用Swift字符串的索引
使用相同的字符串(不考虑字符串长度),如下所示
示例说明:
let s1 = "abc"
let i1 = s1.characters.indexOf("b")!
print(i1) // 1
let s2 = "First, don't use forced unwrap as you can end up easily crashing your app (as it seems it already happened).
Second, you already test for the validity of key.characters.indexOf(char)
, you can place the z
computation within the if-let
:
z = z * s.startIndex.distanceTo(f)
让s1=“abc”
设i1=s1.characters.indexOf(“b”)!
打印(i1)//1
让s2=“首先,不要使用强制展开,因为这样很容易导致应用程序崩溃(似乎已经发生了)
第二,您已经测试了key.characters.indexOf(char)
的有效性,您可以将z
计算放在中,如果let
:
func hash (s:String) -> Int {
var z = 19
let key = Array("abcdefghijk".characters)
for char in s.characters {
if let f = key.indexOf(char) {
print(f)
z = (z &* (f + 1))
}
}
return z
}
您的代码发生的情况是,hash()
函数在遇到k
以外的字符时立即崩溃,因此您还应该将所有可能的字符添加到key
中,如果您将密钥放入字符的数组中,那么indexOf
将返回您需要的Int
:
另外,如果您的字符是键中的第一个索引,您将得到一个值0
,这将使您的哈希值0
,因此我在f
中添加了1
。我还按照@MartinR的建议合并了&*
,以防止Int
溢出。您对返回有什么特殊要求吗散列值?如果不是,我建议您使用func散列(s:String)->Int{return s.hashValue}它是免费的,内置的,至少,但不是最后一个,生成的hashValue符合一些“苹果标准”很好的答案!我投了赞成票。但是这个函数将生成更长的字符串,比如X个字符0。为什么不简单地使用内置的hashValue呢?字符串也符合Hashable。