Я хотел бы написать какую-то беглоподобную api с пользовательскими операторами и функциями. Вот пример того, что я ищу:Swift бегло-подобный дизайн 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