代码之家  ›  专栏  ›  技术社区  ›  cimicimi

如何在swift中将字符串转换成t?[关闭]

  •  -3
  • cimicimi  · 技术社区  · 6 年前

    我需要一个将字符串转换为泛型类型的方法:

    到目前为止我已经试过了,但它对int对象不起作用。当我将对象作为int传递给此方法时,它不会返回int result。你能帮帮我吗? 一个例子;

    let k : Int
    gg(k,"testUrl") // Problem: this method call can't return int value.
    
    func gg<T:Decodable>(_ nesne: T, _ URL: String) -> (T) {
       var returnValue : T?
       let data = "123" // <-- from web service
       returnValue = data as! T
       return returnValue
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Joakim Danielson    6 年前

    我不明白如何在不定义解码器的情况下将字符串解码为泛型类型,所以要么需要一个新的类来实现 Decoder 或者为要用于此函数的类型创建要实现的新协议。这是我使用协议的实现。

    protocol EncodeFromString {
        associatedtype T
        func encodeFrom(_ str: String) -> T?
    }
    
    extension Int: EncodeFromString {
        typealias T = Int
        func encodeFrom(_ str: String) -> Int? {
            return Int(str)
        }
    }
    
    func gg<T: EncodeFromString>(_ nesne: T, _ URL: String) -> (T?) {
        let data = "123"
        return nesne.encodeFrom(data) as? T
    }
    
        2
  •  1
  •   potato    6 年前

    一般来说, String 类型不能总是成功地转换为其他类型,但是,您可以自己实现它。

    例子

    class Functional<T> {
        var t: String
        var need: T {
            get {
                // you can support other types here
                if T.self == Int.self{
                    let re = Int(self.t)
                    return re as! T
                }
                fatalError()
            }
        }
        init(t_: String)  {
            t = t_
        }
    }
    let k : Int = 5
    func gg<T>(_ nesne: T, _ URL: String) -> (T) {
        let data = "123"
        let a = Functional<T>(t_: data)
        return a.need
    }
    print(gg(k, "hello"))