2017-01-22 4 views
0

Я создал некоторые функции с возвращаемым типом Void -> UIImage, и я создал класс FilterApplier для вызова функции по заказу. Идея состоит в том, что каждая функция делает снимок и меняет его. Но когда я добавил первую функцию в массив, она не вернула изображение. Что не так? Написал код на детской площадке, быстро. 7.3.1. Помогите мне пожалуйста: pСоздал массив кортежей для вызова функций, но не может получить возврат

import UIKit 

//Sample images initialization 
let mous = UIImage(named: "moustache.png")! 
let sampleImage = UIImage(named: "sample.png")! 

//Moustache Filter 
func moustacheMaker() -> UIImage{ 
    let newSize: CGSize = CGSize(width: 75, height: 75) 
    let top: UIImage = mous 
    let bottom = sampleImage 
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) 
// Now I draw images to context 
bottom.drawInRect(CGRect(origin: CGPoint.zero, size: newSize)) 
top.drawInRect(CGRect(origin: CGPoint.zero, size: newSize)) 
// Here I return the new image 
let changedImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
return changedImage 
} 
class FilterApplier{ 
    typealias FunctionType = Void -> UIImage 
    var filters = [(Int, String, FunctionType)]() 
    func add(funcOrder: Int, funcName: String, function: FunctionType) -> FilterApplier{ 
     filters.append(funcOrder, funcName, function) 
     return self 
    } 
    func runByOrder(){ 
     filters.sort(){ 
      return $0.0 < $1.0 
     } 
     for filter in filters{ 
      filter.2 
     } 
    } 
} 

FilterApplier().add(2, funcName: "Moustache", function: moustacheMaker).runByOrder() 

К слову: компилятор не действует, как будто есть ошибка. Ничего не происходит: //

+2

'фильтр.2' - это функция. Вам нужно называть это: 'filter.2()'. – vacawama

+0

Что хорошего в том, чтобы запускать функцию фильтра, если вы не вводите какие-либо данные и ничего не делаете с выходом? – vacawama

+0

Действительно - я предполагаю, что это всего лишь пример :) Также Евгений, «funcName», вероятно, не нужен – Fattie

ответ

1

Евгений, я понимаю, что это был всего лишь пример. Как сказал Вака, проблема просто:

filter.2() 

Однако просто FYI один из многих решений здесь было бы это ...

Не забывайте, что в Swift вы должны использовать Extensions все время , везде, по всем причинам, и в каждой строке кода :)

Extension UIImage { 
    filter(with: [(void)]) { 
    for f in with { self = f(self) } 
    } 
} 

, то вы можете просто

testImage.filter(with: [blur, fade, moustache]) 

Но то, что вы на самом деле, возможно, ищете что-то вроде этого ...

[blur, fade, moustache].map({ test = $0(test) }) 

примечания также, что вы можете легко сохранить эту «упорядоченность».

let userChose = [blur, fade, moustache] 

userChose.map({ testA = $0(testA) }) 
userChose.map({ testB = $0(testB) }) 

(Вы можете сделать то же самое с расширением, test.filter(with: userChose))

После того, как вы получите происходит, вы должны проверить syntax для мутирует функции тоже.

+0

Не стесняйтесь ** редактировать этот ответ как wiki **, any – Fattie

+0

Насколько мне нужно загрузить код в Swift 2, я не могу перенести свой код в Swift 3 :(Кроме того, я обнаружил, что в объектах изображения Swift 2 являются неизменными, поэтому я не могу использовать эту строку «self = f (self)». Или я снова сделал ошибку? –