2015-05-09 4 views

cevap

5

siz olduğunuz sürece Nesnenizin sığ bir kopyasını oluşturmak için aşağıdakileri kullanabilirsiniz geliştirilmeye ihtiyacı var. Nesne sınıfında bir uzantı oluşturdum ve bu nesne bir nesneyi objOut alır ve kendiliğinden bakarak düz özellikleri doldurur. Düz olmayan bir özellik bulunduğunda (bir iç içe geçmiş nesne) atlanır. Benim Realms için Yöneticisi sınıfının içinde

// Duplicate object with its flat properties 
func duplicate(objOut: Object) -> Object { 

    // Mirror object type 
    let objectType: Mirror = Mirror(reflecting: self); 

    // Iterate on object properties 
    for child in objectType.children { 

     // Get label 
     let label = child.label! 

     // Handler for flat properties, skip complex objects 
     switch String(describing: type(of: child.value)) { 
     case "Double", "Int", "Int64", "String": 
      objOut.setValue(self.value(forKey: label)!, forKey: label) 
      break 
     default: 
      break 
     } 
    } 

    return objOut 
} 

Ben nesnelerin benim kopyalarını oluşturmak için kullandığınız yöntem copyFromRealm() var.

// Creates copy out of realm 
func copyFromRealm() -> Appointment { 

    // Duplicate base object properties 
    let cpAppointment = self.duplicate(objOut: Appointment()) as! Appointment 

    // Duplicate UIU object 
    cpAppointment.uiu = self.uiu?.duplicate(objOut: UpdateInfo()) as? UpdateInfo 

    // Duplicate AddressLocation object 
    let cpAddress = self.addressLocation?.address?.duplicate(objOut: Address()) as? Address 
    let cpCoordinates = self.addressLocation?.coordinates?.duplicate(objOut: Coordinates()) as? Coordinates 
    cpAppointment.addressLocation = self.addressLocation?.duplicate(objOut: AddressLocation()) as? AddressLocation 
    cpAppointment.addressLocation?.address = cpAddress 
    cpAppointment.addressLocation?.coordinates = cpCoordinates 

    // Duplicate each ExtraInfo 
    for other in self.others { 
     cpAppointment.others.append(other.duplicate(objOut: ExtraInfo()) as! ExtraInfo) 
    } 

    return cpAppointment 
} 

ı bulmak mümkün değildi:

Appointment object 
    - flat properties 
    - one UpdateInfo object 
     - flat properties 
    - one AddressLocation object 
     - flat properties 
     - one Address object 
      - flat properties 
     - one Coordinates object 
      - flat properies 
    - a list of ExtraInfo 
     - each ExtraInfo object 
      - flat properties 

Bu benim copyFromRealm() yöntemini uyguladık nasıl: bu benim Atama sınıfının yapıdır size pratik bir örnek vermek gerekirse duplicate() yöntemimin içinde iç içe geçmiş nesnelerle çalışmak için iyi ve makul bir yol. Özyinelemeyi düşündüm ama kod karmaşıklığı çok arttı.

Bu en uygun değil, ancak iç içe geçmiş nesneyi yönetmenin bir yolunu bulursam, bu yanıtı güncellerim.

+0

Benim durumumda birincil anahtar var, o zaman github için bir özellik isteği dosyalayacağım. – mvo

+0

Fikir: Bir nesneyi (ve onun ilişkilerini) bir Realm'den ayırmanın ve ardından birincil anahtarların nesnede (ve onun ilişkilerinin) yerini almanın ve sonra yeniden eklemenin bir yolu var mı? – mvo

+0

Şu an bu yerleşik alanı almanın hiçbir yolu yoktur, ancak el ile yinelemeli bir kopya yapabilirsiniz. Bana gönderdiğiniz konuyla bağlantı kurduğunuzdan emin olun! – segiddins

0

bu sorun hala hayatta olduğu için ben çalışıyor ancak hala benim çözüm sonrası: Bir birincil anahtar olmadığı için

2

Benzer bir sorunla karşılaştım ve bir realm nesnesinin kopyasını almak için basit bir çözüm buldum. Temelde sadece nesne NSCopying protokolüne uygun yapmak gerekir, gibi bir şey:

class ViewController: UIViewController { 
    var original = Original() 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var myCopy = original.copy() 
    } 
} 

güzel bir şey hakkında:

import RealmSwift 
import Realm 
import ObjectMapper 

class Original: Object, NSCopying{ 
    dynamic var originalId = 0 
    dynamic var firstName = "" 
    dynamic var lastName = "" 

override static func primaryKey() -> String? { 
    return "originalId" 
} 

init(originalId: Int, firstName: String, lastName: String){ 
    super.init() 

    self.originalId = originalId 
    self.firstName = firstName 
    self.lastName = lastName 
} 

func copy(with zone: NSZone? = nil) -> Any { 
    let copy = Original(originalId: originalId, firstName: firstName, lastName: lastName) 

    return copy 
} 
} 

o zaman sadece nesne üzerinde metodu "() kopya" dediğimiz bir kopyaya sahip olmak, bir bölge yazım işleminde olmak zorunda kalmadan değiştirebilirim. Kullanıcılar bazı verileri düzenlediklerinde, ancak henüz kaydetmediklerinde ya da sadece fikirlerini değiştirmediklerinde kullanışlıdır.

3

Benim durumumda sadece bir nesne oluşturmak istedim ve onu sürdürmemek istedim. segiddins'un çözümü benim için işe yaramadı.

kullanımdan hemen swift kullanıcı nesnesinin bir klonu yaratmak için 3

Swift

let newUser = User(value: oldUser);

Yeni kullanıcı nesnesi kalıcı değil.