2016-01-11 100 views
4

最近,我正在閱讀「swift中的函數式編程」。在本書中,作者對Int進行了一些擴展以滿足協議Smaller。爲了深入瞭解作者的想法,我將代碼複製到自己的操場上,但它報告錯誤。二元運算符不能應用於操作數

protocol Smaller { 
    static func smaller() -> Self? 
} 

extension Int: Smaller { 
    static func smaller() -> Int? { 
     //reporting error: Binary operator "==" cann't be applied to type of Int.type and Int 
     return self == 0 ? nil : self/2 
    } 
} 

看起來self == 0是不允許在擴展名中。有沒有人知道原因。

+0

我不知道迅速,但爲什麼在協議和擴展(返回類型)不同的方法的簽名? – trojanfoe

+0

這是swift協議的規則,Self必須由類型本身替換。 – rrrain

+8

在'static'方法中,關鍵字'self'指的是類型,而不是一個實際的實例,所以你不應該使用'static',因爲它看起來像你想處理'Int'的實例哦! –

回答

1

我不認爲你想使用一個靜態函數,因爲你需要一個實例化的整數來處理,並檢查它是否更小。

所以有2種方法:

  • 從功能上消除靜電,然後通常把它叫做: let aInt = 4 aInt.smaller() //will be 2

  • 或更改靜態函數的簽名就可以接受實例作爲參數

`

protocol Smaller { 
    static func smaller(selfToMakeSmall: Self) -> Self? 
} 

extension Int: Smaller { 
    static func smaller(selfToMakeSmall: Int) -> Int? { 
    //reporting error: Binary operator "==" cann't be applied to type of Int.type and Int 
    return selfToMakeSmall == 0 ? nil : selfToMakeSmall/2 
    } 
} 


let theInt = 4 
Int.smaller(theInt) 

`

,但我認爲這可能與仿製藥也提高

相關問題