2016-12-02 87 views
4

我正尝试使用自定义函数创建一个简单的Swift 3模板,以便在Xcode应用程序中使用postfix一元运算符来计算百分比。这可能看起来像一个重复的问题,因为我以前的帖子中的accepted answer已经展示了如何在Playground中做到这一点。但是我发现自定义函数在Xcode项目中的工作方式不同。成员运算符'%'必须至少有一个类型为'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’. 

任何人都可以解释为什么%功能需要在Xcode项目static,什么最后的错误消息在同一直线上(见下文)的情况下意味着什么?由于

模板草案

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

一个可以定义操作符,如上所述类型的静态成员函数中夫特3, 但只有当他们采取该类型的至少一个参数。

移动声明的文件范围内来解决这个问题:

postfix operator % 

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

class ViewController: UIViewController { 

    // ... 

} 
+0

我也尝试将函数移动到文件范围,因为您建议它不再是静态的。这次我测试了它,它确认你的答案。谢谢。 – Greg

+0

您可能对使用静态后缀函数的解决方案感兴趣。无论如何,我从你的输入中学到了很多东西。谢谢。见最终编辑http://stackoverflow.com/questions/40941827/how-to-access-a-custom-function-from-any-file-in-the-same-swift-project – Greg

1

其他的选择,如果你想在使用封闭斯威夫特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。 Functional Swift:Swift 3更新(Kindle Location 542)。 GbR Florian Kugler & Chris Eidhof。 Kindle版。

相关问题