Функциональный тип аннотации в Swift

swift functional-programming swift3

297 просмотра

3 ответа

19 Репутация автора

Чтобы вызвать функцию с аргументами, нужно написать каждый параметр вместе в Swift 3.0. Но когда функция назначена константе с аннотацией типа, нет необходимости записывать каждый параметр. Почему?

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! 
Автор: 이재은 Источник Размещён: 18.07.2016 08:26

Ответы (3)


-2 плюса

309 Репутация автора

когда вы делаете «сокращение», вы создаете «s», который является универсальным типом, любой функции, которая отвечает требованию подписи, чтобы иметь входной параметр типа Int и никакого возвращаемого значения.

Когда вы присваиваете foo этой константе, вы удовлетворяете требованию типа, и foo теперь «вложен» в s.

Может быть...

Автор: SKOOP Размещён: 18.07.2016 08:52

1 плюс

6303 Репутация автора

Потому что вы можете назначить более конкретный объект переменной более общего типа (например, объект подкласса для переменной суперкласса, но мы здесь не говорим о классах), но не наоборот.

(base: Int) -> ()это более конкретный случай общей (Int) -> ()функции. Итак, any (base: Int) -> ()- это (Int) -> ()функция, но не любая (Int) -> ()функция - это (base: Int) -> ()функция.

И позже, когда вы используете созданную вами переменную, Swift обрабатывает ее в соответствии с ее типом. Если это так (base: Int) -> (), то имя аргумента является обязательным, иначе это не требуется.

Итак, в первом случае вы явно объявляете переменную как (Int) -> ()и используете ее соответственно. Свифт не делает никаких предположений в отношении этих строк:

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

Он только знает, что переменная имеет тип (Int) -> (). Это может быть любая другая (Int) -> ()функция (whatever: Int) -> (), например.

Во втором случае переменная явно создается как (base: Int) -> (), поэтому для ее использования необходимо указать имя.

В третьем случае переменная неявно создается как (base: Int) -> ()(Swift выводит тип автоматически).

Автор: FreeNickname Размещён: 18.07.2016 09:21

0 плюса

25 Репутация автора

{
    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

            }
        }

    })


}
Автор: Sagar vaishnav Размещён: 04.05.2017 09:43
Вопросы из категории :
32x32