2016-12-02 2 views
4

Я пытаюсь создать простой шаблон Swift 3 с пользовательской функцией для вычисления процента с помощью постфиксарного унарного оператора в приложении Xcode. Это может показаться дублирующимся вопросом, потому что accepted answer в моем предыдущем сообщении уже показывает, как это сделать на Playground. Но с тех пор я обнаружил, что пользовательская функция не работает одинаково в проекте Xcode.Member operator '%' должен иметь хотя бы один аргумент типа 'ViewController'

В шаблоне ниже, я объявил ’operator' at file scope (или, по крайней мере, я считаю, что сделал). Но когда функция постфикса объявлена, Xcode советует, что

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

и предлагает исправить-то вставить static. С static вставлено Xcode затем советует

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

Может кто-нибудь объяснить, почему функция % должна быть static в проекте Xcode и что означает последнее сообщение об ошибке в контексте одной и той же линии (см ниже)? Благодаря

Проект шаблона

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) 
    } 
} 

EDITED Шаблон

Вот рабочий шаблон на основе принятого ответа. Я не понял, что подразумевается под объявлением оператора в области файлов.

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) 
    } 
} 

СНОСКА

Опираясь на принятый ответ, пользовательские функции оператора, сгруппированные в одном файле, теперь могут быть доступны из других файлов в одном проекте. Чтобы увидеть больше, посетите here.

ответ

7

Я объявил «оператор» в файле сферы

Нет, ты не сделал. Вы определили его в рамки определения UIViewController:

postfix operator % 

class ViewController: UIViewController { 

    // ... 

    static postfix func % (percentage: Int) -> Double { 
     return (Double(percentage)/100) 
    } 
} 

Один может определить операторы как статические функции-члены типа в Swift 3 , но только если они принимают по крайней мере один аргумент типа.

Переместить декларацию в области файла, чтобы решить эту проблему:

postfix operator % 

postfix func % (percentage: Int) -> Double { 
    return (Double(percentage)/100) 
} 

class ViewController: UIViewController { 

    // ... 

} 
+0

Я также попытался переместить функцию в область действия файла, как вы предложили, где она больше не является статической. На этот раз я его протестировал, и это подтверждает ваш ответ. Благодарю. – Greg

+0

, вы можете быть заинтересованы в решении, используя статические функции postfix. Несмотря на это, я многому научился с вашего вклада. Благодарю. См. Окончательное изменение http://stackoverflow.com/questions/40941827/how-to-access-a-custom-function-from-any-file-in-the-same-swift-project – Greg

1

другой альтернативы, если вы хотите использовать замыкания в 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, Крис; Куглер, Флориан; Swierstra, Wouter. Функциональный Swift: обновлен для Swift 3 (разжечь местоположение 542). GbR Florian Kugler & Chris Eidhof. Kindle Edition.

Смежные вопросы