iOS 如何制作一个函数来接受向 NSCoding 确认的参数

错误代码开发者

我有保存原语和确认对象的功能NSCodingUserDefaults

func set(_ value: Any?, forKey key: String) {
    if let value = value {
        if (value is NSCoding) {
            let encodedValue = NSKeyedArchiver.archivedData(withRootObject: value)
            UserDefaults.standard.set(encodedValue, forKey: key)
        } else {
            print("Storage: failed to save value for key \(key). Value must confirm to NSCoding protocol")
        }
    } else {
        UserDefaults.standard.removeObject(forKey: key)
    }
}

我想摆脱函数内部的一致性检查。所以函数必须只接受NSCoding值。

我试图将函数的签名更改为:

func set(_ value: NSCoding?, forKey key: String)

和这个:

func set<T: Any>(_ value: T?, forKey key: String) where T: NSCoding 

但是,我在每个函数调用中都会遇到编译错误。

在第一种情况下,我得到:

参数类型“***”不符合预期类型“NSCoding?”

在第二:

无法将“***”类型的值转换为预期的参数类型“_?”

我应该改变什么才能使它工作?

桑迪普班达里

方法声明本身似乎没有问题

func set<T: Any>(_ value: T?, forKey key: String) where T: NSCoding {
    if let value = value {
            let encodedValue = NSKeyedArchiver.archivedData(withRootObject: value)
            UserDefaults.standard.set(encodedValue, forKey: key)
    } else {
        UserDefaults.standard.removeObject(forKey: key)
    }
}

但是编译错误指出你传递给这个函数的值可能不兼容 NSCoding

示例调用上述函数

self.set("abcd", forKey: "test")

给出错误

无法将“String”类型的值转换为预期的参数类型“_?”

另一方面称它为

self.set(NSString(string: "abcd"), forKey: "test")

工作良好。所以请确保您传递正确的参数:)

编辑 1:

基于 OP 的评论测试了泛型方法 Int

    let test: Int = 100
    self.set(test, forKey: "test")

导致同样的错误,但将其装箱为 NSNumber

    let test: Int = 100
    self.set(NSNumber(value: test), forKey: "test")

编辑2:

回答 OP 的评论

但是为什么字符串值通过 if (value is NSCoding) check in my original function?

    let a: Any = "abcd"
    if a is NSCoding {
        debugPrint("am here")
    }

那是因为您的 any 通过了NSCoding检查,在您的情况下,无论您传递给函数的值是什么,您都将其类型转换为AnyAny通过检查:)

因此它在你的第一种方法中工作,但在泛型上失败了 :) 希望它有所帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建一个函数来接受参数并在调用时增加参数?

如何编写一个scala函数来接受两种类型的参数?

如何编写一个TypeScript函数来接受将接口实现为参数的类?

定义一个函数来接受特定的列表参数

有没有办法声明一个函数参数来接受一个匿名枚举?

如何实现NSCoding

如何制作一个接受另一个带参数元组的函数

如何制作一个接受另一个带有可变参数的函数

如何编写自己的函数来接受并使用函数作为参数?

我如何创建一个自定义ArgumentMatcher来接受其他匹配器的参数?

参数类型'Int'与预期类型'NSCoding&NSCopying&NSObjectProtocol'不符

如何创建一个函数来接受串联的源值-Excel VBA

如何使用一个参数来实现函数来交换对象的私有内容

制作一个可以接受各种形式参数的函数

如何使一个函数接受另一个函数的值的参数?

如何根据提供给第一个函数的参数来推断参数?

如何使用两个参数创建一个函数来查找节点是否存在?

如何创建一个函数来查找给定两个参数的可整除位数

使用NSCoding时如何处理字段类型更改

如何在Swift中的泛型类上实现NSCoding?

Swift NSCoding-如何读取编码数组

如何使用NSCoding将Int编码为可选

如何使用NSCoding序列化C数组?

NSCoding:如何在继承的类中创建所需的init

NSInvalidArgumentException 与 NSCoding

如何制作一个可以接受任何类型参数的 Java 类

NSCoding:保存自定义对象并加载到表视图iOS

如何使一个函数接受其他函数作为参数(没有已知参数)

如何声明一个将接受带有参数但不带参数的函数的函数?