Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在尝试将JS脚本移植到Swift,但有些东西没有';t计算权_Javascript_Ios_Swift - Fatal编程技术网

Javascript 正在尝试将JS脚本移植到Swift,但有些东西没有';t计算权

Javascript 正在尝试将JS脚本移植到Swift,但有些东西没有';t计算权,javascript,ios,swift,Javascript,Ios,Swift,该脚本将为IRC上的刻痕着色 下面是JavaScript: <script type="text/javascript"> function clean_nick(nick) { nick = nick.toLowerCase(); nick = nick.replace(/[^a-z]/g, "") return nick; } function hash(nick) { var clean

该脚本将为IRC上的刻痕着色

下面是JavaScript:

<script type="text/javascript">
    function clean_nick(nick) {
        nick = nick.toLowerCase();
        nick = nick.replace(/[^a-z]/g, "")

        return nick;
    }

    function hash(nick) {
        var cleaned = clean_nick(nick);
        var h = 0;

        for(var i = 0; i < cleaned.length; i++) {
            var a = cleaned.charCodeAt(i)
            var b = (h << 6)
            var c = (h << 16)
            var d = h

            h = a + b + c - d;
        }

        console.log(h);

        return h;
    }

    function get_color(nick) {
        var nickhash = hash(nick);
        var deg = nickhash % 360;
        var h = deg < 0 ? 360 + deg : deg;
        var l = 50;

        if(h >= 30 && h <= 210) {
            l = 30;
        }

        var s = 20 + Math.abs(nickhash) % 80;

        return "hsl(" + h + "," + s + "%," + l + "%)";
    }

    console.log(get_color("kIrb-839432-`~#$%^&*()_+{}|:<>?/,'.;[]=-_-"));
</script>

功能清洁切口(切口){
nick=nick.toLowerCase();
尼克=尼克。替换(/[^a-z]/g,”)
返回尼克;
}
函数散列(nick){
var cleaned=清洁切口(切口);
var h=0;
对于(变量i=0;i<0.length;i++){
var a=清洁的charCodeAt(i)
变量b=(h UInt32{
让characterString=字符串(自身)
设标量=characterString.Descalars
返回标量[scalars.startIndex].value
}
}
func cleanNick(nick:String)->String{
设lowercaseinck=nick.lowercased()
让noNumberNick=lowerCaseNick.components(分隔为:CharacterSet.decimalDigits).joined()
让nopuncationnick=noNumberNick.components(分隔符:CharacterSet.标点符号).joined()
让noSymbolNick=nopuncationnick.components(separatedBy:CharacterSet.symbols).joined()
let finishedNick=noSymbolNick.replacingOccurrences(of:,with:)
返回结束点
}
func散列(nick:String)->Int{
let cleanned=cleanneck(尼克:尼克)
var h=0
用于清洁的煤焦{
设a=char.unicodeScalarCodePoint()

让b=(h=30&&h位运算符在javascript中的行为就像它们应用于32位有符号整数(),而普通运算符的行为就像它们应用于64位浮点。因此,javascript中的
位运算符的行为就像它们应用于32位有符号整数()但是正常算子的作用就好像它们被应用到64位浮点上,因此<>代码> 所有需要考虑的事情都写在华中科技大学的评论中。
这是我的
hash
函数版本。它产生的结果与我用Safari测试JavaScript代码的结果相同:

func hash(_ nick: String) -> Int64 {
    let cleaned = cleanNick(nick)
    var h: Int64 = 0

    for a in cleaned.utf16 {
        let b = Int32(truncatingIfNeeded: h) &<< 6
        let c = Int32(truncatingIfNeeded: h) &<< 16
        let d = h

        h = Int64(a) + Int64(b) + Int64(c) - d
    }
    print(h) //-> -1501579218 (JS:-1501579218)

    return h
}

所有你需要考虑的事情都写在D·V.P.S.ZZOR的评论中。

这是我的
hash
函数版本。它产生的结果与我用Safari测试JavaScript代码的结果相同:

func hash(_ nick: String) -> Int64 {
    let cleaned = cleanNick(nick)
    var h: Int64 = 0

    for a in cleaned.utf16 {
        let b = Int32(truncatingIfNeeded: h) &<< 6
        let c = Int32(truncatingIfNeeded: h) &<< 16
        let d = h

        h = Int64(a) + Int64(b) + Int64(c) - d
    }
    print(h) //-> -1501579218 (JS:-1501579218)

    return h
}

不要发布链接。你的问题需要将相关代码作为文本包含在你的问题中。清楚地解释你在翻译中遇到的问题。经过编辑,问题只是哈希计算不一样,即使数学是相同的。预期的输出是什么?不熟悉Swift,但我认为
charCodeAt()的输出
characterString.unicodeScalars[i]。值不相同。
charCodeAt()
返回UTF-16输出,而
Unicodescalar
是UTF-32。我还没有详细阅读您的代码,但另一个可能的问题是位和溢出的数量。由于JS和Swift之间的默认位数量可能因您测试的设备而异,并且处理溢出的方式也不同,因此您应该uld还将查看两段代码中的中间结果,看看它们的不同之处。不要发布链接。你的问题将相关代码作为文本包含在你的问题中。清楚地解释你在翻译中遇到的问题。经过编辑,问题只是哈希计算不一样,即使数学是相同的。问题是什么预期输出?不熟悉Swift,但我认为
charCodeAt()
characterString.unicodeScalars[I].value的输出不一样。
charCodeAt()
返回UTF-16输出,而
Unicodescalar
是UTF-32。我还没有详细阅读您的代码,但另一个可能的问题是位和溢出的数量。由于JS和Swift之间的默认位数量可能因您测试的设备而异,并且处理溢出的方式也不同,因此您应该uld还可以查看两段代码中的中间结果,并查看它们的不同之处。您是否检查了调用
散列(nick:“zzzz”)
时会发生什么情况?JavaScript代码返回
-2536702720
表示
散列(“zzzzzz”)
。记住javascript中的加减运算符的行为就像它们应用于64位浮点一样。更改代码以补偿双重行为是否检查了调用
散列(尼克:“zzzz”)
?javascript代码为
散列(“zzzz”)返回
-2536702720
。记住javascript中的加法/减法运算符的行为就像它们应用于64位浮点。更改代码以补偿双重行为非常酷。工作完全符合预期。还有,是的,我的Cleanneck一团糟,我还是iOS开发人员。非常感谢:)啊,非常酷。工作完全符合预期。而且是的,我的cleanNick一团糟,我还是iOS开发新手。非常感谢:)
func cleanNick(nick: String) -> String {
    let lowercased = nick.lowercased().unicodeScalars
    return String(
        lowercased.filter( CharacterSet(charactersIn: "a" ... "z").contains )
    )
}
var l = 50 // Declares variable l and assigns it to 50

if (h >= 30 && h <= 210) {
    l = 30
}
let l: Int // Declares constant l

if (h >= 30 && h <= 210) {
    l = 30
} else {
    l = 50
}
func hash(_ nick: String) -> Int64 {
    let cleaned = cleanNick(nick)
    var h: Int64 = 0

    for a in cleaned.utf16 {
        let b = Int32(truncatingIfNeeded: h) &<< 6
        let c = Int32(truncatingIfNeeded: h) &<< 16
        let d = h

        h = Int64(a) + Int64(b) + Int64(c) - d
    }
    print(h) //-> -1501579218 (JS:-1501579218)

    return h
}
func cleanNick(_ nick: String) -> String {
    var result = nick.lowercased()
    result = String(result.unicodeScalars.filter{"a" <= $0 && $0 <= "z"})

    return result
}