2016-07-18 7 views
2

引数を指定して関数を呼び出すには、各パラメータをSwift 3.0で一緒に書き込む必要があります。 しかし、関数を型名付きの定数に代入した後は、各パラメータを記述する必要はありません。どうして?swiftの関数型の注釈

func foo(base : Int) { 
    print ("param = \(base)") 
} 

// Case 1 
let s : (Int) ->() = foo 

s(5) // SUCCESS! 
s(base:5) // Error! 

// Case 2 
let k : (base: Int) ->() = foo 

k(5) // Error! 
k(base: 5) // SUCCESS! 

// Case 3 
let t = foo 

t(5) // Error! 
t(base: 5) // SUCCESS! 
+1

「let s:(base:Int) - >()= foo'または単に「let s = foo'」で閉じることができます。 –

+4

Swift 3の将来のバージョンでは、関数型のパラメータ名を指定することはできませんが、[この進化の提案](https://github.com/apple/swift-evolution/blob/master/proposals/0111- remove-arg-label-type-significance.md)。 – Hamish

答えて

-2

あなたが「速記」を行うとき、あなたはタイプのIntの入力パラメータ、ノーリターン値を持つの署名要件を満たす任意の関数で、一般的なタイプだ「s」を作成しています。

fooをその定数に割り当てると、タイプ要件を満たし、fooはs内に「ネスト」されます。あなたは、より一般的な型の変数に、より特定のオブジェクトを割り当てることができます(スーパークラス変数に例えばサブクラスのオブジェクトが、私たちはここのクラスについて話していない)、しかしので多分

...

1

逆ではありません。

(base: Int) ->()は、一般的な(Int) ->()関数のより具体的なケースです。したがって、(base: Int) ->()(Int) ->()関数ですが、(Int) ->()関数は(base: Int) ->()関数ではありません。

作成した変数を使用すると、Swiftはその変数をその種類に従って処理します。 (base: Int) ->()の場合、引数名は必須です。それ以外の場合は必須ではありません。

したがって、最初のケースでは、変数を明示的に(Int) ->()と宣言し、それに応じてそれを使用します。スウィフトは、これらのライン上の任意の仮定をしていません。

s(5) // SUCCESS! 
s(base:5) // Error! 

それが唯一の変数の型(Int) ->()を持っていることを知っています。例えば(whatever: Int) ->()のような他のどんな(Int) ->()関数でもかまいません。

2番目のケースでは、変数は明示的に(base: Int) ->()として作成されるため、名前を指定する必要があります。

第3のケースでは、変数はです。(base: Int) ->()として自動的に作成されます。

0
{ 
    let location : NSString = Txtsrch.text! as NSString 
    let geocoder : CLGeocoder = CLGeocoder() 

    geocoder.geocodeAddressString(location as String, completionHandler: {(placemarks, error) -> Void in 
     if((error) != nil){ 
      print("Error", error) 

      let alert = UIAlertController(title: "Search Invelid", message: "Please Enter Valid Place", preferredStyle: UIAlertControllerStyle.alert) 
      alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 
      self.present(alert, animated: true, completion: nil) 

     } 
     else 
     { 


      if let placemark = placemarks?.first { 
       let coordinates : CLLocationCoordinate2D = placemark.location!.coordinate 
      } 
      if (placemarks!.count > 0) { 
       print(placemarks![0]) 
       let topResult : CLPlacemark = placemarks![0] 
       let placemark: MKPlacemark = MKPlacemark(placemark: topResult); 
       self.lat = (placemark.location?.coordinate.latitude)! 
       self.lng = (placemark.location?.coordinate.longitude)! 
       print("coordinate=",placemark.location?.coordinate.latitude) 
       var region: MKCoordinateRegion = self.mapli!.region; 
       region.center = (placemark.location?.coordinate)!; 

       region.span.longitudeDelta /= 8.0; 
       region.span.latitudeDelta /= 8.0; 
       self.mapli!.setRegion(region, animated: true); 
       self.mapli!.addAnnotation(placemark); 
       self.bool = true 

      } 
     } 

    }) 


}