Swift: Instance method as closure not working
up vote
0
down vote
favorite
var closureA: (String)->()
class Test
func instanceMethod(string: String)
let a = Test()
closureA = Test.instanceMethod(a)
closureA("hello")
Xcode10 Playground show error:
error: cannot assign value of type '(String) -> ()' to type '(String) -> ()'
closureA = Test.instanceMethod(a)
I already read: https://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/
swift closures
add a comment |
up vote
0
down vote
favorite
var closureA: (String)->()
class Test
func instanceMethod(string: String)
let a = Test()
closureA = Test.instanceMethod(a)
closureA("hello")
Xcode10 Playground show error:
error: cannot assign value of type '(String) -> ()' to type '(String) -> ()'
closureA = Test.instanceMethod(a)
I already read: https://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/
swift closures
Isnt it should beclosureA = a.instanceMethod("something")
,a
is not a String andTest
is class, not class instance
– Tj3n
Nov 9 at 4:10
@Tj3n nope. a.instanceMethod("something") means call the method. I want to store the instance method instead of calling it.
– 100mango
Nov 9 at 4:19
It seems like a bug of playground. Note that you could also havea.instanceMethod
which has type(String) -> ()
– hfehrmann
Nov 9 at 13:53
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
var closureA: (String)->()
class Test
func instanceMethod(string: String)
let a = Test()
closureA = Test.instanceMethod(a)
closureA("hello")
Xcode10 Playground show error:
error: cannot assign value of type '(String) -> ()' to type '(String) -> ()'
closureA = Test.instanceMethod(a)
I already read: https://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/
swift closures
var closureA: (String)->()
class Test
func instanceMethod(string: String)
let a = Test()
closureA = Test.instanceMethod(a)
closureA("hello")
Xcode10 Playground show error:
error: cannot assign value of type '(String) -> ()' to type '(String) -> ()'
closureA = Test.instanceMethod(a)
I already read: https://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/
swift closures
swift closures
edited Nov 9 at 4:14
rmaddy
236k27306373
236k27306373
asked Nov 9 at 4:04
100mango
1679
1679
Isnt it should beclosureA = a.instanceMethod("something")
,a
is not a String andTest
is class, not class instance
– Tj3n
Nov 9 at 4:10
@Tj3n nope. a.instanceMethod("something") means call the method. I want to store the instance method instead of calling it.
– 100mango
Nov 9 at 4:19
It seems like a bug of playground. Note that you could also havea.instanceMethod
which has type(String) -> ()
– hfehrmann
Nov 9 at 13:53
add a comment |
Isnt it should beclosureA = a.instanceMethod("something")
,a
is not a String andTest
is class, not class instance
– Tj3n
Nov 9 at 4:10
@Tj3n nope. a.instanceMethod("something") means call the method. I want to store the instance method instead of calling it.
– 100mango
Nov 9 at 4:19
It seems like a bug of playground. Note that you could also havea.instanceMethod
which has type(String) -> ()
– hfehrmann
Nov 9 at 13:53
Isnt it should be
closureA = a.instanceMethod("something")
, a
is not a String and Test
is class, not class instance– Tj3n
Nov 9 at 4:10
Isnt it should be
closureA = a.instanceMethod("something")
, a
is not a String and Test
is class, not class instance– Tj3n
Nov 9 at 4:10
@Tj3n nope. a.instanceMethod("something") means call the method. I want to store the instance method instead of calling it.
– 100mango
Nov 9 at 4:19
@Tj3n nope. a.instanceMethod("something") means call the method. I want to store the instance method instead of calling it.
– 100mango
Nov 9 at 4:19
It seems like a bug of playground. Note that you could also have
a.instanceMethod
which has type (String) -> ()
– hfehrmann
Nov 9 at 13:53
It seems like a bug of playground. Note that you could also have
a.instanceMethod
which has type (String) -> ()
– hfehrmann
Nov 9 at 13:53
add a comment |
2 Answers
2
active
oldest
votes
up vote
0
down vote
I think you are missing the point of closure, you can't store the function in the closure, but you can store the piece of code that call to the function with the variable you are passing into the closure, and the function still need a class instance to call it, so it should be like this:
var closureA: ((String)->())?
class Test
func instanceMethod(string: String)
print(string)
let a = Test()
//Assume you have a variable `str: String` before hand that will execute the code inside closure
closureA = str in
a.instanceMethod(string: str)
//Actual call to the closure to execute it
closureA?("hello")
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
add a comment |
up vote
0
down vote
I think is the bug of the playground. If we create a temp closure B, and assign it to closure A. Then it works.
var closureA: (String)->()
class Test
func instanceMethod(string: String)
print("Test")
let a = Test()
let closureB = Test.instanceMethod(a)
closureA = closureB
closureA("hello") // works
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
I think you are missing the point of closure, you can't store the function in the closure, but you can store the piece of code that call to the function with the variable you are passing into the closure, and the function still need a class instance to call it, so it should be like this:
var closureA: ((String)->())?
class Test
func instanceMethod(string: String)
print(string)
let a = Test()
//Assume you have a variable `str: String` before hand that will execute the code inside closure
closureA = str in
a.instanceMethod(string: str)
//Actual call to the closure to execute it
closureA?("hello")
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
add a comment |
up vote
0
down vote
I think you are missing the point of closure, you can't store the function in the closure, but you can store the piece of code that call to the function with the variable you are passing into the closure, and the function still need a class instance to call it, so it should be like this:
var closureA: ((String)->())?
class Test
func instanceMethod(string: String)
print(string)
let a = Test()
//Assume you have a variable `str: String` before hand that will execute the code inside closure
closureA = str in
a.instanceMethod(string: str)
//Actual call to the closure to execute it
closureA?("hello")
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
add a comment |
up vote
0
down vote
up vote
0
down vote
I think you are missing the point of closure, you can't store the function in the closure, but you can store the piece of code that call to the function with the variable you are passing into the closure, and the function still need a class instance to call it, so it should be like this:
var closureA: ((String)->())?
class Test
func instanceMethod(string: String)
print(string)
let a = Test()
//Assume you have a variable `str: String` before hand that will execute the code inside closure
closureA = str in
a.instanceMethod(string: str)
//Actual call to the closure to execute it
closureA?("hello")
I think you are missing the point of closure, you can't store the function in the closure, but you can store the piece of code that call to the function with the variable you are passing into the closure, and the function still need a class instance to call it, so it should be like this:
var closureA: ((String)->())?
class Test
func instanceMethod(string: String)
print(string)
let a = Test()
//Assume you have a variable `str: String` before hand that will execute the code inside closure
closureA = str in
a.instanceMethod(string: str)
//Actual call to the closure to execute it
closureA?("hello")
answered Nov 9 at 5:03
Tj3n
6,81211328
6,81211328
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
add a comment |
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
Then the closure is relevant to a. I would like to store different class same type instance method in this closure.
– 100mango
Nov 9 at 6:28
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
And "Global and nested functions, as introduced in Functions, are actually special cases of closures."
– 100mango
Nov 9 at 6:36
add a comment |
up vote
0
down vote
I think is the bug of the playground. If we create a temp closure B, and assign it to closure A. Then it works.
var closureA: (String)->()
class Test
func instanceMethod(string: String)
print("Test")
let a = Test()
let closureB = Test.instanceMethod(a)
closureA = closureB
closureA("hello") // works
add a comment |
up vote
0
down vote
I think is the bug of the playground. If we create a temp closure B, and assign it to closure A. Then it works.
var closureA: (String)->()
class Test
func instanceMethod(string: String)
print("Test")
let a = Test()
let closureB = Test.instanceMethod(a)
closureA = closureB
closureA("hello") // works
add a comment |
up vote
0
down vote
up vote
0
down vote
I think is the bug of the playground. If we create a temp closure B, and assign it to closure A. Then it works.
var closureA: (String)->()
class Test
func instanceMethod(string: String)
print("Test")
let a = Test()
let closureB = Test.instanceMethod(a)
closureA = closureB
closureA("hello") // works
I think is the bug of the playground. If we create a temp closure B, and assign it to closure A. Then it works.
var closureA: (String)->()
class Test
func instanceMethod(string: String)
print("Test")
let a = Test()
let closureB = Test.instanceMethod(a)
closureA = closureB
closureA("hello") // works
answered Nov 9 at 6:48
100mango
1679
1679
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53219718%2fswift-instance-method-as-closure-not-working%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Isnt it should be
closureA = a.instanceMethod("something")
,a
is not a String andTest
is class, not class instance– Tj3n
Nov 9 at 4:10
@Tj3n nope. a.instanceMethod("something") means call the method. I want to store the instance method instead of calling it.
– 100mango
Nov 9 at 4:19
It seems like a bug of playground. Note that you could also have
a.instanceMethod
which has type(String) -> ()
– hfehrmann
Nov 9 at 13:53