我创建了一个示例项目和旁边的框架.该框架称为"SampleFramework".然后我在SampleFramework中创建了一个自定义运算符.这是它的样子:
infix operator >>= {associativity left}
public func >>=<A, B>(a: A?, f: A -> B?) -> B? {
if let a = a { return f(a) }
else { return .None }
}
Run Code Online (Sandbox Code Playgroud)
然后我想用它作为我的主要应用程序.我导入了SampleFramework我的源文件,然后我编写了这段代码来测试它:
NSURL(string: "www.google.com") >>= { println("\($0)") }
Run Code Online (Sandbox Code Playgroud)
它没有编译.这是Xcode的错误消息:
为运营商找到不明确的运营商声明.运算符不是已知的二元运算符
mus*_*afa 10
我想到了.我认为operator(infix operator >>= {associativity left})的声明是特定于模块的.您无法对其应用访问控制.但是可以在其他模块中访问操作员功能.因此,为了完成这项工作,我必须复制操作员声明并将其粘贴到主项目中.
我可以确认你所看到的是真正发生的事情.我自己尝试了,我看到了同样的结果.
我的意见是,>>=它与某些其他运算符(可能是咬合移位运算符:)在某种程度上发生冲突,>>或者正在其他地方声明(你可以看到为什么我认为这里).我在框架中成功声明了自定义运算符,并在之前使用了主应用程序代码中的那些(例如,您可以在此处看到).
我建议将自定义运算符重命名为其他名称.当我这样做(重命名自定义运算符>>>=)时,编译器停止抱怨并且我的应用程序编译得很好.
好.所以这可能会有所帮助.基本上,当一个操作符已经被声明并且你想为该操作符添加额外的功能时(例如3 * "Hello"像Johan Kool所说的那样做)他们所要做的就是重载该操作符的方法.
基本上,在您的特定情况下,我现在是100%,这>>=是一个已经声明的运算符,您可以继续,只需在您的框架中添加这些行:
public func >>=<A, B>(a: A?, f: A -> B?) -> B? {
if let a = a { return f(a) }
else { return .None }
}
Run Code Online (Sandbox Code Playgroud)
这将使您的操作员工作.但是它会继承原始运算符的优先级和关联性,从而减少对它应该如何表现的控制.
| 归档时间: |
|
| 查看次数: |
2067 次 |
| 最近记录: |