is it possible to create a generic closure in Swift?

后端 未结 4 1290
一生所求
一生所求 2020-12-30 19:49
func myfunc(i:T) -> T {
    return i
}

is it possible to make this generic function a closure?

let myfunc = {          


        
相关标签:
4条回答
  • 2020-12-30 20:30

    As mentioned, variables in Swift cannot be generic, so creating a closure, whose generic types are specified by the caller is not possible. However, there are workarounds:

    With SE-253, it is possible to make arbitrary (nominal) types callable. So instead of declaring a generic closure, we can declare a (non-generic) struct that has a generic callAsFunction method:

    struct MyFunc {
        func callAsFunction<T>(_ i: T) -> T {
            return i
        }
    }
    

    Now, we can declare a non-generic variable that we can call with a generic value:

    let myFunc = MyFunc()
    let x = myFunc(42) // -> Int
    let y = myFunc("foo") // -> String
    

    Note that this workaround doesn't apply to all situations, but it can be helpful in some.

    0 讨论(0)
  • 2020-12-30 20:40

    I have found some alternative way , you can use Anyobject in your closure and pass any values to your method .

    typealias genericCompletion<T:AnyObject> = ((Bool,T,String) -> Void)
    struct Student {
        var name:String = "Kishore"
        var age : String = "125"
    }
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.createAGenericReturn { (success, object, message) in
    
            }
    
            self.createStructGeneric { (success, student, message) in
    
            }
    
        }
    
    
        func createAGenericReturn(callback:@escaping(genericCompletion<AnyObject>)){
            callback(true,434.433 as AnyObject,"kishoreTest")
        }
    
        func createStructGeneric(callback:@escaping(genericCompletion<AnyObject>)){
            callback(true,Student.init() as AnyObject,"kishoreTest")
        }
    
    }
    

    Here you can see I mentioned Generic as Anyobject typealias genericCompletion = ((Bool,T,String) -> Void) , So you can pass any values to it .

    0 讨论(0)
  • 2020-12-30 20:49

    No, because variables and expressions can't be generic. There are only generic functions and generic types.


    To clarify: In some languages you can have types with a universal quantifier, like forall a. a -> a. But in Swift, types cannot have a universal quantifier. So expressions and values cannot be themselves generic. Function declarations and type declarations can be generic, but when you use such a generic function or an instance of such a generic type, some type (which could be a real type or a type variable) is chosen as the type argument, and thereafter the value you get is no longer itself generic.

    0 讨论(0)
  • 2020-12-30 20:50

    Probably you need something like this.

    Type declaration:

    typealias ResultClosure<T> = (ResultCode, String?, T?) -> Void
    

    Function declaration:

    func loginUser(userName: String, password: String, resultHandler: ResultClosure<TokenModel>?)
    

    Usage:

        NetConnector.shared.loginUser(userName: userName ?? "", password: password ?? "") { (code, message, data) in
            self.display?.unlockScreen()
            if code == .success {
                if let activeToken = data {
                    AppData.shared.userToken = activeToken
                }
                self.display?.showHome()
            } else {
                self.display?.showError(errorMessage: message)
            }
        }
    
    0 讨论(0)
提交回复
热议问题