swift4 protocol 参数问题请教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ystanglei
V2EX    Swift

swift4 protocol 参数问题请教

  •  
  •   ystanglei 2017-10-09 16:38:16 +08:00 5825 次点击
    这是一个创建于 2924 天前的主题,其中的信息可能已经有所发展或是发生改变。
    /// 编码对象为 json 字符串 /// /// - Parameter obj: 需要被编码的对象 /// - Returns: 编码后的 json 字符串 private func encode<T : Encodable>(obj: T) -> String? { let encoder = JSONEncoder() guard let data = try? encoder.encode(obj) else { return nil } return String(data: data, encoding: String.Encoding.utf8) } 

    这里有一个方法,对实现了 Encodable 的类型的数据进行编码,实际情况是传递过来的数据类型是 Any,

    private func test(data: Any) { //1,这里不可以 if data is Encodable { //调用 encode(obj: data as! Encodable) } else { print("不支持的参数格式") } // 2.swift 这样写也是错误的 guard let d = data as? Encodable else { return } encode(obj: d) } 

    这两种写法都是错误的,cannot invoke 'encode' with an argument list of type '(obj:Encodable)'

    那么我应该怎么判断这个 Any 类型的 data 并把他转化为可以交给 encode ()使用的方式。

    4 条回复    2018-05-31 09:35:04 +08:00
    gbammc
        1
    gbammc  
       2017-10-10 14:52:48 +08:00
    你需要把 data 转为一个实现 Encodable 的类型( class,struct 或其它)再传给 encode 方法。
    ainopara
        2
    ainopara  
       2017-10-11 21:58:02 +08:00 via iPhone
    encode 方法接受的参数是一个类 /结构体 /枚举的实例。并且要求这个类型必须符合 Encodable 协议。<T: Encodable>(obj: T)
    这和直接传一个符合 Encodable 协议的对象 (obj:Encodable) 的区别是,编译器在编译的时候就可以知道都有哪些遵循 Encodable 协议的类型有可能被使用到,并为其生成相关数据。
    所以你在类型转换的时候需要直接转换到具体要的那个类型而不是一个泛泛的 Encodable 协议。所有会作为参数传进来的类型都应该有对应的判断,是不是很麻烦?要我说一开始就不应该把类型信息擦掉,不要让对方传个 Any 给你就没这问题了。
    ystanglei
        3
    ystanglei  
    OP
       2017-10-31 16:14:49 +08:00
    @ainopara 我这里接受的参数 是所有可以编码为 json 字符串类型,可能是字典,可能是数组,也可能是对象结构体等,所以我这里才会写 Encodable
    ainopara
        4
    ainopara  
       2018-05-31 09:35:04 +08:00
    @ystanglei 你的需求应该直接使用 JSONSerialization
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2674 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 13:47 PVG 21:47 LAX 06:47 JFK 09:47
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86