2017-08-20 1 views
2

Ce que j'essaie de faire est d'écrire une fonction générique qui compresse l'image.Une fonction Swift peut-elle accepter uniquement une plage de valeurs?

func compress(image: UIImage, withRatio ratio: CGFloat) -> Data? { 
    return UIImageJPEGRepresentation(image, ratio) 
} 

Mais ici ratio du compress() peut être une valeur CGFloat0...∞, mais je veux seulement accepter 0.0...1.0. Y-a-t-il un moyen de faire ça?

+0

vous voulez un Range' Swift 'comme paramètre ou souhaitez-vous transmettre les valeurs de début/fin dans un paramètre de tableau (par exemple comme ce que l'on peut faire en créant des dégradés)? –

+2

NON, vous ne pouvez pas représenter une telle contrainte dans le système de types actuel de Swift. Vous pouvez simplement mettre un contrôle d'exécution en utilisant 'assert' ou des fonctions similaires. – OOPer

+0

vous pouvez utiliser 'precondition (0.0 ... 1.0 ~ = ratio)' –

Répondre

1

Comme votre fonction peut déjà renvoyer nil, vous pouvez vérifier la valeur de ratio avant de l'utiliser. Si ce n'est pas dans la plage souhaitée, vous pouvez renvoyer nil.

func compress(image: UIImage, withRatio ratio: CGFloat) -> Data? { 
    if 0...1 ~= ratio { 
     return UIImageJPEGRepresentation(image, ratio) 
    } else { 
     return nil 
    } 
} 

Ou vous pouvez lancer une exception:

enum CompressError: Error { 
    case ratioOutOfRange 
} 

func compress(image: UIImage, withRatio ratio: CGFloat) throws -> Data? { 
    if 0...1 ~= ratio { 
     return UIImageJPEGRepresentation(image, ratio) 
    } else { 
     throw CompressError.ratioOutOfRange 
    } 
}