2016-08-25 5 views
1

以下のクラスは、そのプロパティを変更するには変異の機能を提供します。突然変異関数を使用してクラスプロパティを設定する方法は?

class Person { 

    struct Location { 
     var coordinate: CLLocationCoordinate2D! 
     var city: String? 

     mutating func setLocationNameFromCoordinate(completion:(()->())?) { 

      let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) 
      CLGeocoder().reverseGeocodeLocation(location) { (placemarks: [CLPlacemark]?, error: NSError?) in 

       guard let city = placemarks?.first?.locality where error == nil else { 
        return 
       } 

       self.city = city //1 
       completion?() 
      } 
     } 
    } 

    var location: Location? 
} 

機能はそれほどのように呼ばれている:

person.location?.setLocationNameFromCoordinate() { 
    print(person.location?.city) //2 
} 

しかし、都市名が設定されている1で、内側からそれを見て位置Structであるが、2には都市名がオブジェクトに設定されていない。私はここで間違って何をしていますか?

+0

@Hamishはい:a.location?.city

編集1と同じである

enter image description here

私は閉鎖して、それ自身の位置を通過し、私はそれの価値を確認しました'person.location?.coordinate'には値があります。 – Manuel

+1

'reverseGeocodeLocation'が非同期に動作するため、これは動作しません。都市を設定する補完ハンドラは 'print'行のかなり後に呼び出されます。 – vadian

+0

@vadianの場合、実際には変換関数も補完ハンドラを持っているので、 'reverseGeocodeLocation'が完了したときにのみprintを呼び出しています。コードを更新しました。 – Manuel

答えて

1

varを構造体の外部から変更することはできますが、独自のメソッドから変更することはできません。あなたはこのようにしてみることができます。

class Person { 

    struct Location { 
     var coordinate: CLLocationCoordinate2D! 
     var city: String? 

     mutating func setLocationNameFromCoordinate(completion: (city: String) -> Void) { 

      let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) 
      CLGeocoder().reverseGeocodeLocation(location) { (placemarks: [CLPlacemark]?, error: NSError?) in 

       guard let city = placemarks?.first?.subLocality where error == nil else { 
        return 
       } 

       self.city = city //Breakpoint1 
       completion(city: city) 

      } 
     } 
    } 

    var location: Location? 
} 
+0

しかし、私はmutable構造体( 'var')が' mutating'関数でそのプロパティを変更している他の多くの例を見ています。それでなぜ私の場合はうまくいかないのですか?また、mutatingプロパティでない場合の 'mutating'キーワードは何ですか? http://stackoverflow.com/a/26447291/1870795 – Manuel

0

私はいくつかのサンプルコードを書き、私はそれはあなたに馴染みだと思うし、それはちょうど私が思う正しい方法で結果です。 、

enter image description here

+0

これはGnanavadiveluの答えと同じです。私は、Gnanavadiveluの答えで私のコメントを参照してくださいコード例があるように見えるので、構造体自体が変異することができます知っていると思います。 – Manuel

+1

@Manuel Gnanavadiveluが多分間違っていると思います。「mutating」キーワードは、関数が構造体のプロパティを変更することを意味します。私の編集を見ると、それはあなたと同じ方法です。ですから、あなたの問題は '変異する 'とは関係ないかもしれないと思うので、'参照型 'のようなものを探してみてください。 –

+0

reverseGeocodeLocationクロージャー外の変数を変更すると、都市名が変更されます。 http://stackoverflow.com/questions/37851249/swift-mutable-structs-in-closure-of-class-and-struct-behave-differently – Gnanavadivelu

関連する問題