成员运算符“%”必须至少有一个类型为“ViewController”的参数

Posted

技术标签:

【中文标题】成员运算符“%”必须至少有一个类型为“ViewController”的参数【英文标题】:Member operator '%' must have at least one argument of type 'ViewController’ 【发布时间】:2016-12-02 12:25:56 【问题描述】:

我正在尝试创建一个简单的 Swift 3 模板,其中包含一个自定义函数,用于在 Xcode 应用程序中使用后缀一元运算符计算百分比。这似乎是一个重复的问题,因为我之前的帖子中的accepted answer 已经展示了如何在 Playground 中执行此操作。但后来我发现自定义函数在 Xcode 项目中的工作方式不同。

在模板下面中,我声明了’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)
    

已编辑模板

这是基于已接受答案的工作模板。我不明白在文件范围内声明运算符是什么意思。

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。

【问题讨论】:

【参考方案1】:

我在文件范围内声明了“操作员”

不,你没有。您在范围内定义了它 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 

    // ...


【讨论】:

我还尝试将函数移动到文件范围,如您所建议的那样,它不再是静态的。这次我对其进行了测试,它可以确认您的答案。谢谢。 您可能对使用静态后缀函数的解决方案感兴趣。无论如何,我从你的意见中学到了很多。谢谢。见最终编辑***.com/questions/40941827/…【参考方案2】:

如果您想在 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 
    //...

艾德霍夫,克里斯;库格勒,弗洛里安;斯韦斯特拉,沃特。功能性 Swift:针对 Swift 3(Kindle 位置 542)进行了更新。 GbR Florian Kugler 和 Chris Eidhof。 Kindle版。

【讨论】:

以上是关于成员运算符“%”必须至少有一个类型为“ViewController”的参数的主要内容,如果未能解决你的问题,请参考以下文章

重载运算符

C++学习(四七一)重载运算符

错误:C2016 C 要求结构或联合至少有一个成员

C++ Primer Plus学习:第十一章

Typescript:至少有一个T类型属性的对象。

C++ string库函数详解