我想用自定義的運算符和函數編寫一些類似流利的api。這裏是什麼,我正在尋找一個例子:自定義運算符的Swift-like api設計
var result = [Section]()
result +++= Section()
.appendTitle(title)
.appendPhotos(photos)
result +++= Section()
.appendSomething(sth)
.appendPhotos(photos)
.appendAnything()
return result
爲了做到這一點,我已經聲明瞭兩個運營商定製:
infix operator +++{ associativity left precedence 95 }
funC+++(lhs : [Section], rhs : Section) -> [Section] {
var result = lhs
result.append(rhs)
return result
}
infix operator +++= { associativity left precedence 95 }
funC+++=(inout lhs : [Section], rhs : Section) {
lhs = lhs +++ rhs
}
,當然還有正確的擴展爲Section
結構:
extension Section {
mutating func appendTitle(title: String?) -> Section {
guard let unwrappedTitle = title
else { return self }
...
return self
}
mutating func appendPhotos(photos: [Photo]?) -> Section {
...
}
...
}
不幸的是預期還是不行...
線result +++= Section()
單獨是正確的,但是當我添加.append
它不編譯。
的第一個消息是:Passing value of type '[Section]' to an inout parameter requires explicit '&'
然後我試圖把一個&
在result
前面(但我從來沒有做過它a += 1
)有一個第二條消息:Cannot use mutating member on immutable value: function call returns immutable value
因此,如果任何人都可以幫助,這將不勝感激。
我使用的是Swift 2.2和Xcode 7.
謝謝您的回答第一個答案,那就是在迅速的通病,因爲多年的面向對象的,我們通常(至少部分地)忘記了按值傳遞參數而不是通過參考有時會導致對語言的誤解。無論如何,謝謝你,因爲這是你的第一個答案,我會自豪地接受它,因爲它比我的更明確。 ;) – Zaphod
@Zaphod,你已經做了一個很好的觀點。隨着多年的面向對象程序設計,很容易忽視功能語言的使用。 Swift是一種功能性語言,它關乎不變性。感謝接受。 :) – Gurdeep