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
我正在努力使用Swift
String
来查找我想在某种散列函数中用作
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。