当前位置: 首页 > 面试题库 >

字典扩展在哪里

太叔望
2023-03-14
问题内容

我正在尝试创建字典扩展,其中字典的类型为

在很多地方都在寻找并尝试了不同的方法,但是似乎没有一个可行。这是其中之一:

extension Dictionary where <String, AnyObject>{
    var jsonString:String {
        return ""
    }
}

由于某种原因实际上不起作用的另一种方法:

extension Dictionary where Key:Hashable, Value:AnyObject {

    var jsonString:String {

        do {
           let stringData = try NSJSONSerialization.dataWithJSONObject(self, options: NSJSONWritingOptions.PrettyPrinted)
            if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
                return string
            }
        }catch _ {

        }
        return ""
    }
}

得到: 参数类型“字典”与预期类型的​​“ AnyObject”不符


问题答案:

> = 3.1

从3.1开始,我们可以进行具体扩展,即:

extension Dictionary where Key == String {}

<3.1

我们无法使用具体泛型来实现具体类型,即:

extension Dictionary where Key == String

但是,由于Dictionary符合序列,并且我们可以符合带有具体泛型的协议类型,因此我们可以:

extension Sequence where Iterator.Element == (key: String, value: AnyObject) {
    func doStuff() {...

否则,我们可以将密钥约束为字符串遵循的协议,如下所示:

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    var jsonString: String {
        return ""
    }
}

根据您更新的答案。Json序列化需要一个对象,Swift字典是结构。您需要转换为。NSDictionary
必须指定Key要符合NSObject才能正确转换为NSDictionary

小提示:字典已经将约束类型输入KeyHashable,因此您最初的约束没有添加任何内容。

extension Dictionary where Key: NSObject, Value:AnyObject {

    var jsonString:String {

        do {
            let stringData = try NSJSONSerialization.dataWithJSONObject(self as NSDictionary, options: NSJSONWritingOptions.PrettyPrinted)
            if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
                return string
            }
        }catch _ {

        }
        return ""
    }
}

请注意,字典必须符合此类型才能访问扩展名。

let dict = ["k" : "v"]

将成为type [String : String],因此您必须明确声明:

let dict: [NSObject : AnyObject] = ["k" : "v"]


 类似资料:
  • 当我收到扩展错误时,我无法知道为什么会发生错误。

  • Szenario:我有两个扩展,它们用一些特定字段扩展了。在TYPO3 9之前,我必须使用以下打字脚本配置对新闻扩展的依赖关系进行配置: 模型扩展了基本扩展的模型: 在TYPO3 10中,在(中断:#87623): 只要您只有一个扩展新闻扩展名的扩展名,它就可以工作多久。如果您有第二个扩展并启用TYPO3缓存,您将得到一个错误,即在第一个扩展中添加的字段在新闻扩展的模板中不可用。奇怪的是,这个问题

  • ES6加强了对Unicode的支持,并且扩展了字符串对象。 字符的Unicode表示法 JavaScript允许采用\uxxxx形式表示一个字符,其中“xxxx”表示字符的码点。 "\u0061" // "a" 但是,这种表示法只限于\u0000——\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表达。 "\uD842\uDFB7" // "

  • 我正在Windows上运行Monodevelop。我已经安装了Git扩展(包括msysGit)。我使用mysysGit生成了一个RSA密钥对(ssh-keygen-t RSA),并将该密钥添加到我们的Git服务器(使用Gitlab)。这种设置是正确的:我可以使用命令行以及Git扩展GUI(它本身使用命令行)推拉。然而,在Monodevelop中,推拉失败。 版本控制 那么,MonoDevelopm

  • 我安装了一些仅在特定工作区中启用的扩展。 通过设置,通常工作区特定的东西会保存在工作区文件夹中的. vscode/settings.json中。然而,扩展似乎不是这种情况。 我知道扩展本身也安装在。vscode/extensions在user profile文件夹中,但我找不到任何指示它们是启用还是禁用的内容。这适用于本地、远程和给定工作区。 检查设置同步似乎会显示一个extensions.jso

  • 为了扩展现有字段,您必须将内置字段(例如FieldTextInput,FieldColour)子类化,然后修改其中的一部分以满足您的需求。 您可以修改的字段的某些部分是: 它的编辑器 它的块显示 它显示的文本 如果要创建不需要任何内置字段行为的自定义字段,则应将Field子类化。 常用扩展 大多数自定义字段扩展了以下三种类型之一: 文本输入 如果希望用户在字段中键入内容,则应扩展FieldText