Следующее, построенное из вашего вопроса выше, компилируется и прекрасно работает для меня на игровой площадке с использованием Xcode 10.2.
import Foundation
extension Dictionary where Key == String {
public func optionalValue<T>(_ key: String) throws -> T? {
guard let value = self[key] else { return nil }
guard !(value is NSNull) else { return nil }
guard let typedValue = value as? T else { throw NSError() }
return typedValue
}
}
var dictionary = [String:Any]()
dictionary["nullKey"] = NSNull()
dictionary["intKey"] = 12345
var value: Int?
value = try dictionary.optionalValue("nullKey")
value = try dictionary.optionalValue("intKey")
Строка value = try dictionary.optionalValue("nullKey")
выводит nil
как ожидалось и value = try dictionary.optionalValue("intKey")
выводит 12345
.
Поэтому, чтобы ответить на ваш вопрос, он должен работать нормально.