2016-03-16 2 views
3

Я не говорю о указателях на функции C, а в методе типа Swift.Как объявить, создать и использовать указатели методов в Swift?

struct Test: GeneratorType { 
    var methodPointer: mutating() -> Bool? // Non-working guess 
    var which: Bool 

    init() { 
     which = false 
     methodPointer = which ? &testMethod1 : &testMethod2 // Also non-working guess 
    } 

    //... 
} 

компилятор говорит «mutating» не является законным в рамках функции декларации. (На самом деле, он просто предлагает полуколоду.) И для инициализации указателя (после удаления mutating) компилятор думает, что я пытаюсь вызвать функции и использовать их результаты вместо этого. Я хочу использовать методы как объекты внутри себя, а не как вызов функции. Позже я хочу использовать направленный метод в пределах next; не вычисляя это, мне придется прибегнуть к флагом перечисления и вручную выбрать, какой метод вызывать в пределах next.

Надеюсь, что есть часть механики закрытия, которая позволяет это. Может быть, что-то вроде this page, which describes functions returning functions. Но ни один из примеров, которые я видел, упоминает методы mutating.

+0

Ссылку вы предоставили был с июля 2014 года и не следует доверять. Это произошло через месяц после того, как Свифт вышел, и эти статьи, как правило, вводят в заблуждение, ошибочны и устарели. Вы можете попробовать документы Swift на закрытие. https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html – ryantxr

+0

От взгляда на [этот текст] (https://twitter.com/JadenGeller/status/619426292232908800) , Я не думаю, что методы 'mutating' поддерживаются, даже если я могу выяснить, как вызывать нестатические методы. – CTMacUser

+0

Мои попытки часто заканчиваются на «Частичное применение метода« mutating »не допускается». – CTMacUser

ответ

0

Посмотрите, поможет ли это вам.

class Something { 
    var f: (() -> Int)? 
    let f1 = {() -> Int in /* do some action here */ return 1} 
    let f2 = {() -> Int in /* do some action here */ return 2} 

    func ff(which: Bool) { 
     f = which ? f1 : f2 
    } 

    func act() { 
     if let f = f { 
      f() 
     } 
    } 
} 
+0

Я попробовал. Он работает, но я мог * не * получить доступ к 'self' или любым свойствам из' f1' или 'f2', поэтому для меня это бесполезно. – CTMacUser

0

Вот как я это делаю -

class FcnArgs {        //@goal pass a fcn as arg 

    class func demo() { 
     let fPtr = funcToPointTo;   //@type '((Int)->String)' 
     print(fPtr(4)); 
    } 

    class func funcToPointTo(_ i : Int) -> String { 
     print("I Was passed \(i)"); 
     return "I was returned"; 
    } 
} 

FcnArgs.demo() Выход:

I Was passed 4 
I was returned