2015-12-08 1 views

ответ

1

Я использовал, чтобы сделать объект SwiftyJSON JSON, установив ключ и значение для каждой переменной, но он чувствовал себя утомительной это делать для каждого класса, который я делаю, и не был гибким при добавлении к нему новых переменных, поэтому я нашел лучший способ для Swift 2.0.

С Swift 2.0 они представили класс под названием Mirror. Используя это, вы можете перебирать ваши Lets и переменные, как, например:

class User { 
    var name:String 
    var age:Int 

    init(name: String, age: Int) { 
     self.name = name 
     self.age = age 
    } 

    var json: JSON { 
     get { 
      var dict = [String: AnyObject]() 
      let mirror = Mirror(reflecting: self) 
      for (_, attr) in mirror.children.enumerate() { 
       if let property_name = attr.label as String! { 
        dict[property_name] = attr.value as? AnyObject 
       } 
      } 
      return JSON(dict) 
     } 
    } 
} 

Итак, если вы хотите, чтобы получить версию JSON ваших объявленных переменных и значений:

let user1 = User(name: "Bob", age: 52) 
print(user1.json) 

Это поможет вам :

{ 
    "age" : 52, 
    "name" : "Bob" 
} 

Для получения строки, смотрите на this answer:

user1.json.rawString()! 
+0

Я сделал то же, что и вы, но я получил пустую строку json. – fcbflying

+0

@fcbflying Я просто копировал и вставлял свой собственный код в пустой проект с SwiftyJSON, и он работает. Вы что-то изменили? –

+0

Я добавляю '?' в конце моей собственности. когда я удаляю его, он работает. – fcbflying

1

Заканчивать SwiftyJSON Дока об инициализации https://github.com/SwiftyJSON/SwiftyJSON#initialization

В принципе единственный вариант, чтобы написать метод, чтобы преобразовать ваш объект в словарь и другой, который может построить свой объект из словаря.

Простой пример для двух свойств пользователя:

class User { 
    var name:String 
    var age:Int 

    init(name: String, age: Int) { 
    self.name = name 
    self.age = age 
    } 
} 

extension User { 
    convenience init(userDict: [String : AnyObject]) { 
    let name = userDict["name"] as! String 
    let age = userDict["age"] as! Int 
    self.init(name: name, age: age) 
    } 

    func serialize() -> [String : AnyObject] { 
    return ["name": name, "age": age] 
    } 
} 

Затем, если вы хотите передать JSon строки вокруг вашего приложения вы можете проверить

NSJSONSerialization.dataWithJSONObject

NSString(data: yourdata, encoding: NSUTF8StringEncoding)

производить строка json. Существует также NSJSONSerialization.JSONObjectWithData, чтобы конвертировать ваши данные в другую сторону.

Надеюсь, что это поможет!

Edit: Чтобы вернуть строку, содержащую JSON заменить метод сериализации со следующим:

func serialize() -> String? { 
     if let data = try? NSJSONSerialization.dataWithJSONObject(["name": name, "age": age], options: NSJSONWritingOptions(rawValue: 0)) { 
     if let s = NSString(data: data, encoding: NSUTF8StringEncoding) { 
     return s as String 
     } 
    } 
    return nil 
    } 
+0

Как вы указали, как вызвать его при преобразовании swift объекта в строку json, я новичок ios. – fcbflying

Смежные вопросы