2017-03-13 10 views
0

私は新しいiOS開発者です。MKPlacemarkインスタンスをRealmに保存する方法はありますか?

MKPlacemarkインスタンスをRealmに保存したいのですが、保存方法がわかりません。 Realmに保存するには、すべてのプロパティがプリミティブ、NSString、NSDate、NSData、NSNumber、RLMArray、RLMLinkingObjects、またはRLMObjectのサブクラスでなければなりません。

この場合、どのようにしてMKPlacemarkを適切なプロパティに変換できますか?

答えて

1

レルムオブジェクトのみ、他のレルムのオブジェクトにプリミティブ型と参照をサポートしているので、あなたは再びレルムにMKPlacemarkのコンポーネントを翻訳し、可能な機構を作成する必要があります。

はおそらくクリーンな方法は、設定または取得すると、内部的に変換を実行すること(cgImage :)のような性質として、Objective-Cのオブジェクトのスウィフト3命名規則以下)mkPlacemarkという名前のパブリック変数を持っているだろう。

class Placemark: Object { 
    dynamic var latitude = 0.0 
    dynamic var longitude = 0.0 
    dynamic var street: String? 
    dynamic var city: String? 
    dynamic var zipCode: String? 
    dynamic var country: String? 

    public var mkPlacemark: MKPlacemark { 
     set { 
     latitude = newValue.coordinate.latitude 
     longitude = newValue.coordinate.longitude 
     street = newValue.addressDictionary[kABPersonAddressStreetKey] 
     city = newValue.addressDictionary[kABPersonAddressCityKey] 
     zipCode = newValue.addressDictionary[kABPersonAddressZipCodeKey] 
     country = newValue.addressDictionary[kABPersonAddressCountryKey] 
     } 
     get { 
     let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
     let addressDictionary = [kABPersonAddressStreetKey: street, 
            kABPersonAddressCityKey: city, 
            kABPersonAddressZipCodeKey: zipCode, 
            kABPersonAddressCountryKey: country] 
     return MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary) 
     } 
    } 

    convinience init(placemark: MKPlacemark) { 
     super.init() 
     self.mkPlacemark = placemark 
    } 

} 

(それは実際にコンパイルすることができます前に、それはいくつかの調整が必要になる場合がありますので、私は、手でこのコードを書いた。:))

+0

ありがとうTiM。あなたのアプローチは素晴らしいです&ええ、それはいくつかの微調整が必​​要です。だから私は働くコードで答えを加えました。 –

+1

この回答を確認しましたが、すべての回答が本当に役に立ちました:-) ありがとうございました! – chizcake

0

独自のRLMObjectを作成して、MKPlacemarkプロパティを含めることができます。

class RLMPlacemark: Object { 
var coordinate: CLLocationCoordinate2D? 
var addressDictionary: [String: Any]? 

required convenience init?(placemark: MKPlacemark) { 
    self.init() 
    self.coordinate = placemark.coordinate 
    self.addressDictionary = placemark.addressDictionary as! [String : Any]? 
} 

}

+1

Realmに 'CLLocationCoordinate2D'プロパティを直接格納することはできません。あなたは2つの「倍」(緯度と経度)に分割する必要があります。 – joern

0

をこの答えはTIMの答えの微調整バージョンです。以下のプロパティは変更の対象となります。

RLMObjectMKPlacemarkプロパティタイプを持つことはできません。 mkPlacemarkはsetを持つことはできません。 get &を持つことができます。これは、ストアドプロパティではなくインスタンス変数として機能します。 iOS 9+用に更新されました。新しい連絡先フレームワークを使用します。 super.init()はに、これは誰にも役立ちます場合、それは素晴らしいことだself.init()

import Foundation 
import MapKit 
import RealmSwift 
import Contacts 

class RLMPlacemark: Object { 
    dynamic var latitude = 0.0 
    dynamic var longitude = 0.0 
    dynamic var street: String? 
    dynamic var city: String? 
    dynamic var state: String? 
    dynamic var zipCode: String? 
    dynamic var country: String? 
    dynamic var countryCode: String? 

    public var placemark: MKPlacemark { 
     get { 
      let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
      let addressDictionary = [CNPostalAddressStreetKey : street, 
            CNPostalAddressCityKey : city, 
            CNPostalAddressStateKey : state, 
            CNPostalAddressPostalCodeKey : zipCode, 
            CNPostalAddressCountryKey : country, 
            CNPostalAddressISOCountryCodeKey : countryCode] 
      let warningFreeAddressDictionary = (addressDictionary as Any) as? [String : Any] 
      return MKPlacemark(coordinate: coordinate, addressDictionary: warningFreeAddressDictionary) 
     } 
    } 

    convenience init(lat: Double, long: Double, street: String?, city: String?, state: String?, zipCode: String?, country: String?, countryCode:String?) { 
     self.init() 
     self.latitude = lat 
     self.longitude = long 
     self.street = street 
     self.city = city 
     self.state = state 
     self.zipCode = zipCode 
     self.country = country 
     self.countryCode = countryCode 
    } 

    convenience init(placemark: MKPlacemark) { 
     self.init(lat: placemark.coordinate.latitude, 
        long: placemark.coordinate.longitude, 
        street: placemark.addressDictionary?[CNPostalAddressStreetKey] as? String, 
        city: placemark.addressDictionary?[CNPostalAddressCityKey] as? String, 
        state: placemark.addressDictionary?[CNPostalAddressStateKey] as? String, 
        zipCode: placemark.addressDictionary?[CNPostalAddressPostalCodeKey] as? String, 
        country: placemark.addressDictionary?[CNPostalAddressCountryKey] as? String, 
        countryCode: placemark.addressDictionary?[CNPostalAddressISOCountryCodeKey] as? String) 
    } 
} 

に変更されました。 AddressDictionaryのキャストは冗長です。直接使用することはできますが、警告メッセージが表示されます&警告が嫌いです。 ;)

+0

Realmは、無視されたとしてマークされている限り、他のプロパティタイプを持つことができます。この場合、Realmには実際には永続化されません。この場合、プロパティは動的にマークされていないため、Objective-Cランタイムには表示されません(したがって無視されます)。この方法では、レルムでサポートされているデータにマップする追加のプロパティを持つことはできますが、保存されることはありません。 – TiM

関連する問題