在没有警告的情况下将[Any?]投射到[Any]

时间:2017-04-26 21:45:10

标签: swift

我正在使用FMDatabase,并希望向其传递一个可能包含可选值的参数数组。这编译得很好,但问题是如果没有得到关于隐式强制的警告我就无法工作。如果我传递一个[Any?]数组,我会在函数中收到警告,但是如果我传递一个[Any]数组,每当我向数组添加一个可选项时,我都会收到警告。我能做的最好的事情是使用以下代码将其剪切为单个警告:

extension FMDatabase {
    func executeQuery(_ sql: String, withArgumentsIn: [Any?]) -> FMResultSet {
        // generates a warning:
        // "Expression implicitly coerced from 'Any?' to Any"
        return self.executeQuery(sql, withArgumentsIn: withArgumentsIn as [Any])
    }
}

我知道您可以使用as Any来避免常规Any对象的问题,但我无法弄清楚如何使用数组。

1 个答案:

答案 0 :(得分:2)

使用map[Any?]转换为[Any]

let a: [Any?] = [1, true, Optional("hello"), nil]
let b = a.map { $0 as Any }

print(type(of: a))  // Array<Optional<Any>>
print(a)            // [Optional(1), Optional(true), Optional("hello"), nil]

print(type(of: b))  // Array<Any>
print(b)            // [Optional(1), Optional(true), Optional("hello"), nil]