【问题标题】:Swift conversion issue快速转换问题
【发布时间】:2016-01-02 06:09:15
【问题描述】:

将我的一些代码从 Objective-C 转换为 Swift。卡在类型转换语句的组合中:

if (![[array objectAtIndex:0] isKindOfClass:[BaseView class]]) {
    //Throw an exception
}

由于分支应该抛出异常,我使用保护语句而不是 if-else。到目前为止,我已经完成了以下工作:

guard NSArray(array: array).objectAtIndex(0) else {
    //throw SomeException
}

请指导剩下的部分,如何使用isKindOfClass,我也怀疑NSArray类型转换的正确性

【问题讨论】:

    标签: ios swift swift2


    【解决方案1】:

    更正确的方法是使用is,因为它的意思是替换isKindOfClass

    guard array.first is BaseView else {
        // Throw exception if its not a BaseView subclass
    }
    

    【讨论】:

    • 如果您不想获取实际的第一个对象而只想检查它是某种 +1,那绝对是更清晰的方法。
    【解决方案2】:

    以下适用于您的情况:

    guard let arr0 = array.first as? BaseView else {
        return // or throw exception
    }
    

    尝试array.first 中的值转换为BaseView,如果转换失败,您将进入else 块,如果您愿意,可以抛出异常。此外(感谢@Adam)如果数组为空,它将返回/抛出。如果您必须检查第 3 个元素是否属于某种类型,则应检查该数组实际上是否包含至少 3 个值。

    考虑以下示例:

    func t(arr : [AnyObject]) {
        guard let arr0 = arr.first as? String else {
            return
        }
        print(arr0)
    }
    
    t(["asd", 123]) // prints something
    t([123, "asd"]) // returns without printing anything
    t([])           // returns without printing anything
    

    【讨论】:

    • 我会使用array.first 而不是array[0] 以避免在数组为空时出现“索引超出范围”错误。
    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多