2016-12-02 73 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版。

相關問題