【问题标题】:NSSet(array: myArray) works on OS X but crashes in UbuntuNSSet(array: myArray) 在 OS X 上工作,但在 Ubuntu 中崩溃
【发布时间】:2015-12-08 17:02:18
【问题描述】:

以下代码在 OS X 上的 Playground 中运行,但在使用 Swift.org 在 Ubuntu 中编译后无法运行。


在游乐场

这按预期工作:

let permutedHands = [["A♦", "A♣", "6♠", "3♦", "T♥"], ["A♣", "A♦", "6♠", "3♦", "T♥"], ["6♠", "A♦", "A♣", "3♦", "T♥"], ["A♦", "6♠", "A♣", "3♦", "T♥"], ["T♥", "6♠", "A♦", "3♦", "A♣"], ["6♠", "T♥", "A♦", "3♦", "A♣"], ["A♦", "T♥", "6♠", "3♦", "A♣"], ["T♥", "A♦", "6♠", "3♦", "A♣"], ["6♠", "A♦", "T♥", "3♦", "A♣"], ["A♦", "6♠", "T♥", "3♦", "A♣"], ["3♦", "6♠", "A♦", "T♥", "A♣"], ["6♠", "3♦", "A♦", "T♥", "A♣"], ["A♦", "3♦", "6♠", "T♥", "A♣"], ["3♦", "A♦", "6♠", "T♥", "A♣"], ["6♠", "A♦", "3♦", "T♥", "A♣"], ["A♦", "6♠", "3♦", "T♥", "A♣"], ["3♦", "T♥", "A♦", "6♠", "A♣"], ["T♥", "3♦", "A♦", "6♠", "A♣"], ["A♦", "3♦", "T♥", "6♠", "A♣"], ["3♦", "A♦", "T♥", "6♠", "A♣"], ["T♥", "A♦", "3♦", "6♠", "A♣"], ["A♦", "T♥", "3♦", "6♠", "A♣"], ["3♦", "T♥", "6♠", "A♦", "A♣"], ["T♥", "3♦", "6♠", "A♦", "A♣"], ["6♠", "3♦", "T♥", "A♦", "A♣"], ["3♦", "6♠", "T♥", "A♦", "A♣"], ["T♥", "6♠", "3♦", "A♦", "A♣"], ["6♠", "T♥", "3♦", "A♦", "A♣"]]

let sortedPerms = permutedHands.map { $0.sort() }
let permSet = NSSet(array: sortedPerms)
let arr = Array(permSet) // [["3♦", "6♠", "A♣", "A♦", "T♥"]]

swift build 用于 Linux 中的 Swift.org

编译时的错误信息:

无法将类型“[[String]]”的值转换为预期的参数类型“[AnyObject]”
让 permSetArray = NSSet(array: sortedPerms)

我绝望地尝试了这个,以防万一:

let sortedPerms = perms.map { $0.sort() }.map { $0 as! AnyObject }

它让编译器很高兴,但它在运行时崩溃:

无法将“Swift.Array”(0x7f84701950d8)类型的值转换为“Swift.AnyObject”(0x7f84701700e8)。
中止(核心转储)

我浏览了 Swift GitHub 存储库,但没有发现关于 NSSet 的任何未实现或不完整的内容,它在 Swift.org 的 Foundation 中看起来不错(据我所知)。

知道如何调试和解决这个问题吗?一种解决方法也是可以接受的。

【问题讨论】:

    标签: linux swift macos foundation nsset


    【解决方案1】:

    我还没有在 Linux 上尝试过 Swift,但是你可以在没有 import Foundation 的情况下使用这个“纯”的 Swift 解决方案:

    let permutedHands = [["A♦", "A♣", "6♠", "3♦", "T♥"], ["A♣", "A♦", "6♠", "3♦", "T♥"], ["6♠", "A♦", "A♣", "3♦", "T♥"], ["A♦", "6♠", "A♣", "3♦", "T♥"], ["T♥", "6♠", "A♦", "3♦", "A♣"], ["6♠", "T♥", "A♦", "3♦", "A♣"], ["A♦", "T♥", "6♠", "3♦", "A♣"], ["T♥", "A♦", "6♠", "3♦", "A♣"], ["6♠", "A♦", "T♥", "3♦", "A♣"], ["A♦", "6♠", "T♥", "3♦", "A♣"], ["3♦", "6♠", "A♦", "T♥", "A♣"], ["6♠", "3♦", "A♦", "T♥", "A♣"], ["A♦", "3♦", "6♠", "T♥", "A♣"], ["3♦", "A♦", "6♠", "T♥", "A♣"], ["6♠", "A♦", "3♦", "T♥", "A♣"], ["A♦", "6♠", "3♦", "T♥", "A♣"], ["3♦", "T♥", "A♦", "6♠", "A♣"], ["T♥", "3♦", "A♦", "6♠", "A♣"], ["A♦", "3♦", "T♥", "6♠", "A♣"], ["3♦", "A♦", "T♥", "6♠", "A♣"], ["T♥", "A♦", "3♦", "6♠", "A♣"], ["A♦", "T♥", "3♦", "6♠", "A♣"], ["3♦", "T♥", "6♠", "A♦", "A♣"], ["T♥", "3♦", "6♠", "A♦", "A♣"], ["6♠", "3♦", "T♥", "A♦", "A♣"], ["3♦", "6♠", "T♥", "A♦", "A♣"], ["T♥", "6♠", "3♦", "A♦", "A♣"], ["6♠", "T♥", "3♦", "A♦", "A♣"]]
    
    let sortedPerms = permutedHands.map { $0.sort() }
    var arr: Array<Array<String>> = []
    sortedPerms.forEach { (a) -> () in
        let contains = arr.contains{ $0 == a }
        if !contains {
            arr.append(a)
        }
    }
    print(arr) // [["3♦", "6♠", "A♣", "A♦", "T♥"]]
    

    【讨论】:

    • 欢迎您。我了解,您不需要为 NSSet 实现 Hashable,但是这种“解决方法”的最终性能应该不会像使用 NSSet 那样最差。很好,我可以帮你
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多