El operador miembro '%' debe tener al less un argumento del tipo 'ViewController'

Estoy tratando de crear una simple plantilla Swift 3 con una function personalizada para calcular el porcentaje utilizando el operador unario de postfijo en una aplicación Xcode. Esto puede parecer una pregunta duplicada porque la respuesta aceptada en mi publicación anterior ya muestra cómo hacer esto en Playground. Pero desde entonces he encontrado que la function personalizada no funciona de la misma manera en un proyecto Xcode.

En la siguiente plantilla, declaré el 'operator' at file scope (o al less creo que lo hice). Pero cuando se declara la function postfix, Xcode aconseja que

  Operator '%' declanetworking in type 'ViewController' must be 'static' 

y ofrece una solución para insert static . Con Xcode insertado static luego aconseja

  Member operator '%' must have at least one argument of type 'ViewController'. 

¿Alguien puede explicar por qué la function % debe ser static en el proyecto Xcode y qué significa el último post de error en el context de la misma línea ( ver más abajo )? Gracias

Plantilla de borrador

 import UIKit postfix operator % class ViewController: UIViewController { var percentage = Double() override func viewDidLoad() { super.viewDidLoad() percentage = 25% print(percentage) } static postfix func % (percentage: Int) -> Double { return (Double(percentage) / 100) } } 

Plantilla EDITADA

Aquí está la plantilla de trabajo basada en la respuesta aceptada. No entendí lo que significa declarar al operador en el scope del file.

 import UIKit postfix operator % postfix func % (percentage: Int) -> Double { return (Double(percentage) / 100) } class ViewController: UIViewController { var percentage = Double() override func viewDidLoad() { super.viewDidLoad() percentage = 25% print(percentage) } } 

NOTA

Sobre la base de la respuesta aceptada, ahora se puede acceder a funciones de operador personalizadas agrupadas en un solo file desde otros files del mismo proyecto. Para ver más visite aquí .

Declaré el 'operador' en el scope del file

No, no lo hiciste. Lo definió en el scope de la definición UIViewController :

 postfix operator % class ViewController: UIViewController { // ... static postfix func % (percentage: Int) -> Double { return (Double(percentage) / 100) } } 

Uno puede definir a los operadores como funciones miembro estáticas de un tipo en Swift 3, pero solo si toman al less un argumento de ese tipo.

Mueva la statement al scope del file para solucionar el problema:

 postfix operator % postfix func % (percentage: Int) -> Double { return (Double(percentage) / 100) } class ViewController: UIViewController { // ... } 

Otra alternativa si desea usar cierres en Swift 3 :

 import UIKit typealias Filter = (CIImage) -> CIImage infix operator >>> func >>> (filter1: @escaping Filter, filter2: @escaping Filter) -> Filter{ return { image in filter2( filter1( image)) } } class ViewController: UIViewController { //... } 

Eidhof, Chris; Kugler, Florian; Swierstra, Wouter. Functional Swift: actualizado para Swift 3 (location de Kindle 542). GbR Florian Kugler y Chris Eidhof. Versión Kindle.