Déterminer si une Gamme contient une valeur
J'essaie de trouver un moyen pour déterminer si une valeur est comprise dans une Range
en Swift.
Fondamentalement, ce que je suis en train de faire, c'est adapter l'une de l'instruction switch exemples de faire quelque chose comme ceci:
let point = (1, -1)
switch point {
case let (x, y) where (0..5).contains(x):
println("(\(x), \(y)) has an x val between 0 and 5.")
default:
println("This point has an x val outside 0 and 5.")
}
Aussi loin que je peux dire, il n'y a pas construit de la manière de faire ce que mon imaginaire .contains
méthode ci-dessus ne.
J'ai donc essayé de prolonger la Range
classe. J'ai terminé la course à pied sur des problèmes avec les génériques si. Je ne peux pas étendre Range<Int>
j'ai donc essayer de l'étendre Range
lui-même.
Le plus proche que j'ai eu était de cela, mais il ne fonctionne pas depuis >=
et <=
ne sont pas définies pour ForwardIndex
extension Range {
func contains(val:ForwardIndex) -> Bool {
return val >= self.startIndex && val <= self.endIndex
}
}
Comment pourrais-je aller sur l'ajout d'un .contains
méthode pour Range
? Ou est-il une meilleure façon de déterminer si une valeur se situe dans une fourchette?
Edit2: Cela semble fonctionner pour étendre Range
extension Range {
func contains(val:T) -> Bool {
for x in self {
if(x == val) {
return true
}
}
return false
}
}
var a = 0..5
a.contains(3) //true
a.contains(6) //false
a.contains(-5) // false
Je suis très intéressé par la ~= opérateur mentionné ci-dessous si, à la recherche dans le maintenant.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire avec le
~=
opérateur:Vous pouvez aussi le faire directement dans un switch:
~=
est la mise en correspondance du modèle de l'opérateur utilisé par cas consolidés. Voir les détails dans les docs.===
et il est appelé le "cas opérateur d'égalité", qui est une sorte de spécialisés de l'égalité avec les comportements qui rendent les cas énoncés plus propre. Donc, c'est peut-être appelée la même chose ici, mais je ne sais pas pour sûr. Sauf si je suis absent, et il n'est pas mentionné du tout dans la Swift opérateur de documentation.case
est défini. Considérez ceci (désolé pour l'un de ligne):class Foo {}; switch 3 {case Foo.self: println("foo"); default: println("default")}
qui donne l'erreur "impossible de trouver une surcharge pour '~=' qui accepte les arguments fournis" surFoo.self
et est fixe si j'définir@infix func ~=(left: AnyClass, right: Int) -> Bool
.Range
de manière à ce que le==
travail d'opérateur de typeT
ainsi. Ajouté ça à mon post original.Avec Swift 5, en fonction de vos besoins, vous pouvez choisir l'une des options suivantes pour déterminer si une
Range
(ou unClosedRange
) contient une valeur.1.
contains(_:)
méthodeRange
,ClosedRange
,CountableRange
etCountableClosedRange
ont uncontains(_:)
méthode.Range
contient(_:)
méthode a la déclaration suivante:Utilisation:
2.
~=(_:_:)
opérateurRange
,ClosedRange
,CountableRange
etCountableClosedRange
ont un~=(_:_:)
de l'opérateur.Range
~=(_:_:)
opérateur a la déclaration suivante:Utilisation:
3. Instruction Switch
Un moyen simple de tester si un
Range
, unClosedRange
, unCountableRange
ou unCountableClosedRange
contient une valeur est d'utiliser une instruction switch:4. Motif de correspondance avec
if case
Comme une alternative à la précédente instruction switch, vous pouvez utiliser
if case
:Par conséquent, afin de résoudre votre problème, vous pouvez utiliser l'une des options suivantes:
Au lieu de vous embêter avec la Gamme, vous pouvez ajouter une simple fonction d'assistance comme ce
Vous pourriez probablement faire quelque chose de similaire avec une fermeture.
contains()
est (maintenant?) une partie de la bibliothèque standard (ref)!Si vous voulez écrire
contains
extension deRange
, utilisezdistanceTo
deForwardIndex
pour déterminer si la valeur donnée relève de gamme.Également utiliser le type spécifique
Element
à la place de protocole généralFowardIndex
comme paramètre de type.Les deux
distanceTo
etElement
font partie deRange
définition.Plus
Range
a déjà uncontains
méthode deextension SequenceType where Generator.Element : Equatable
. De sorte que vous pouvez simplement l'utiliser sans avoir à écrire une vous-même.J'étais en train de regarder la même chose et n':
puis j'ai vu que ~= fait la même chose!