-
1
Acerca de Swift N O T A Para obtener la documentacin preliminar
de una futura actualizacin de la lengua Swift, ver El Swift
Lenguaje de Programacin .
Swift es un nuevo lenguaje de programacin para iOS y OS X
aplicaciones que se basa en la mejor de C y Objective-C, sin las
limitaciones de compatibilidad C. Swift adopta patrones de
programacin seguras y aade caractersticas modernas para hacer la
programacin ms fcil, ms flexible y ms divertido. Borrn y cuenta
nueva de Swift, respaldadas por los maduros y los marcos de cacao y
cacao Touch muy querida, es una oportunidad para re-imaginar cmo
funciona el desarrollo de software. Swift ha estado aos en la
fabricacin. Manzana sent las bases de Swift por el avance de
nuestro compilador, depurador, y la infraestructura marco
existente. Hemos simplificado la gestin de memoria con el recuento
de referencias automtico (ARC). Nuestra pila marco, construido
sobre la base slida de la Fundacin y el Cacao, se ha modernizado y
estandarizada en todo. Objective-C en s ha evolucionado para
soportar bloques, literales coleccin, y los mdulos, lo que permite
la adopcin marco de las tecnologas lingsticas modernas sin
interrupciones. Gracias a este trabajo preliminar, ahora podemos
introducir un nuevo lenguaje para el futuro del desarrollo de
software de Apple. Swift se siente familiar para los
desarrolladores de Objective-C. Adopta la legibilidad de los
parmetros con nombre de Objective-C y el poder del modelo de objeto
dinmico de Objective-C. Proporciona un acceso transparente a los
marcos existentes de cacao y mezclar y combinar la
interoperabilidad con cdigo de Objective-C. La construccin de esta
base comn, Swift introduce muchas nuevas caractersticas y unifica
las partes procesales y orientados a objetos del lenguaje. Swift es
amigable para los nuevos programadores. Es el primer lenguaje de
programacin de sistemas de calidad industrial que es tan expresiva
y agradable como un lenguaje de script. Es compatible con juegos
infantiles, una caracterstica innovadora que permite a los
programadores para experimentar con el cdigo Swift y ver los
resultados inmediatamente, sin la sobrecarga de la creacin y
ejecucin de una aplicacin. Swift combina lo mejor del pensamiento
lengua moderna con la sabidura de la cultura de ingeniera de Apple
en general. El compilador est optimizado para el rendimiento, y el
idioma se ha optimizado para el desarrollo, sin comprometer a
ambos. Est diseado para escalar de "hola, mundo" a todo un sistema
operativo. Todo esto hace que Swift una inversin de futuro slido
para los desarrolladores y para Apple. Swift es una fantstica
manera de escribir iOS y OS X aplicaciones, y seguir evolucionando
con nuevas caractersticas y capacidades. Nuestras metas para Swift
son ambiciosos. No podemos esperar a ver lo que creas con l.
A Swift tour
-
2
La tradicin sugiere que el primer programa en un nuevo idioma
debe imprimir las palabras "Hola, mundo!" En la pantalla. En Swift,
esto se puede hacer en una sola lnea:
println ( "Hola, mundo!" ) Si ha escrito cdigo en C o
Objective-C, esta sintaxis se parece familiar a usted-en Swift,
esta lnea de cdigo es un programa completo. No es necesario
importar una biblioteca independiente para la funcionalidad como de
entrada / salida o manejo de cadenas. El cdigo escrito en el mbito
mundial se utiliza como punto de entrada para el programa, por lo
que no es necesario un principal funcin. Tambin no es necesario
escribir un punto y coma al final de cada sentencia. Este tour le
da suficiente informacin para empezar a escribir cdigo en Swift
mostrando cmo lograr una variedad de tareas de programacin. No se
preocupe si usted no entiende algo, todo lo presentado en este tour
se explica en detalle en el resto de este libro. N O T A Para una
mejor experiencia, abra este captulo como un parque infantil en
Xcode. Parques infantiles permiten editar los listados de cdigo y
ver el resultado inmediatamente. Descargar juegos Los valores
simples Utilice dejar de hacer una constante y var para hacer una
variable. El valor de una constante no necesita ser conocido en
tiempo de compilacin, pero usted debe asignarle un valor
exactamente una vez. Esto significa que puede usar constantes para
nombrar un valor que se determina una vez, pero utiliza en muchos
lugares.
var myVariable = 42 myVariable = 50 let myConstant = 42
Una constante o variable deben tener el mismo tipo que el valor
que se desea asignar a la misma. Sin embargo, no siempre se tiene
que escribir el tipo explcitamente. Proporcionar un valor cuando se
crea una constante o variable permite al compilador deducir su
tipo. En el ejemplo anterior, el compilador infiere quemyVariable
es un nmero entero debido a que su valor inicial es un nmero
entero. Si el valor inicial no proporciona suficiente informacin (o
si no hay valor inicial), especificar el tipo de escritura que
despus de la variable, separados por dos puntos.
let implicitInteger = 70 let implicitDouble = 70.0 let
explicitDouble: Double = 70
EXPERIMENTO Crear una constante con un tipo explcito de flotador
y un valor de 4 . Los valores no se convierten implcitamente a otro
tipo. Si usted necesita para convertir un valor a un tipo
diferente, hacer explcita una instancia del tipo deseado.
let label = "The width is " let width = 94
-
3
let widthLabel = label + String(width) EXPERIMENTO Trate de no
incluir la conversin a la Cadena de la ltima lnea. Qu error Qu se
obtiene? Hay una manera an ms fcil de incluir valores en cadenas:
Escriba el valor entre parntesis, y escribir una barra invertida (
\ ) antes del parntesis. Por ejemplo:
let apples = 3 let oranges = 5 let appleSummary = "I have
\(apples) apples." let fruitSummary = "I have \(apples + oranges)
pieces of fruit."
EXPERIMENTO Use \ () para incluir un clculo de punto flotante en
una cadena y que incluya el nombre de alguien en un saludo. Crear
matrices y diccionarios utilizando corchetes ( [] ), y acceder a
sus elementos por escribir el ndice o la clave entre corchetes.
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water" var occupations = [ "Malcolm":
"Captain", "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public
Relations"
Para crear una matriz vaca o diccionario, utilice la sintaxis de
inicializador. let emptyArray = [String]() let emptyDictionary =
[String: Float]()
Si la informacin de tipo se puede inferir, puede escribir una
matriz vaca como [] y un diccionario vaco como[:] ; por ejemplo,
cuando se establece un nuevo valor para una variable o pasar un
argumento a una funcin.
shoppingList = [] occupations = [:]
Control de flujo Utilice si y cambiar para hacer los
condicionales, y utilizar para - en , para , mientras , y hacer -
mientras quepara hacer bucles. Los parntesis alrededor de la
variable de condicin o bucle son opcionales. Se requieren los
apoyos de todo el cuerpo.
let individualScores = [75, 43, 103, 87, 12] var teamScore = 0
for score in individualScores { if score > 50 {
-
4
teamScore += 3 } else { teamScore += 1 } } teamScore
N O T A En el cdigo anterior, teamScore se escribe en una lnea
por s mismo. Esta es una manera simple de ver el valor de una
variable dentro de un parque infantil. En un caso de declaracin, la
condicin debe ser una expresin-este Booleano significa que el cdigo
comosi la puntuacin {...} es un error, no una comparacin implcita a
cero. Usted puede utilizar si y dejar juntos para trabajar con
valores que pudieran faltar. Estos valores se representan como
opcionales. Un valor opcional o bien contiene un valor o contiene
cero para indicar que el valor no est presente. Escriba un signo de
interrogacin ( ? ) despus de que el tipo de un valor para marcar el
valor como opcional.
var optionalString: String? = "Hello" optionalString == nil var
optionalName: String? = "John Appleseed" var greeting = "Hello!" if
let name = optionalName { greeting = "Hello, \(name)" }
EXPERIMENTO Cambie optionalName a nil . Lo saludo Qu se obtiene?
Aadir una cosa clusula que establece un saludo diferente si
optionalName es nula . Si el valor opcional es nula , el
condicional es falsa y el cdigo entre llaves se omite. De lo
contrario, el valor opcional se desenvuelve y se asigna a la
constante despus de let , lo que hace que el valor envolver
disponible dentro del bloque de cdigo. Switches soportan cualquier
tipo de datos y una amplia variedad de operaciones de
comparacin-que no se limitan a nmeros enteros y las pruebas para la
igualdad.
let vegetable = "red pepper" switch vegetable { case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress": let vegetableComment = "That would
make a good tea sandwich."
-
5
case let x where x.hasSuffix("pepper"): let vegetableComment =
"Is it a spicy \(x)?" default: let vegetableComment = "Everything
tastes good in soup." }
EXPERIMENTO Trate de no incluir el caso por defecto. Qu error Qu
se obtiene? Ntese cmo dejar que se puede utilizar en un patrn para
asignar el valor que coincide con esa parte de un patrn a una
constante. Despus de ejecutar el cdigo dentro de la caja del
interruptor que haca juego, el programa sale de la sentencia
switch. Ejecucin no contina al siguiente caso, lo que no hay
necesidad de romper explcitamente del interruptor al final del
cdigo de cada caso. Se utiliza para - en iterar sobre los elementos
de un diccionario, proporcionando un par de nombres a utilizar para
cada par clave-valor. Los diccionarios son una coleccin
desordenada, por lo que sus claves y valores se repiten a lo largo
en un orden arbitrario.
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var
largest = 0 for (kind, numbers) in interestingNumbers { for number
in numbers { if number > largest { largest = number } } }
largest
EXPERIMENTO Aadir otra variable para realizar un seguimiento de
qu tipo de nmero es el ms grande, as como lo que mayor nmero era.
Utilice mientras que repetir un bloque de cdigo hasta que una
condicin cambia. El estado de un bucle puede estar en el extremo en
su lugar, asegurando que el bucle se ejecuta al menos una vez.
-
6
var n = 2 while n < 100 { n = n * 2 } n var m = 2 do { m = m
* 2 } while m < 100 m
Usted puede mantener un ndice en un bucle, ya sea mediante el
uso de .. < para hacer una serie de ndices o escribiendo un
explcito inicializacin, condicin, y el incremento. Estos dos lazos
hacen lo mismo:
var firstForLoop = 0 for i in 0.. para separar los nombres de
los parmetros y tipos de tipo de retorno de la funcin.
func greet(name: String, day: String) -> String { return
"Hello \(name), today is \(day)." } greet("Bob", "Tuesday")
EXPERIMENTO Retire el da parmetro. Agregar un parmetro para
incluir el almuerzo especial de hoy en el saludo.
-
7
Utilice una tupla para hacer un ejemplo de valor para el
compuesto, para devolver varios valores de una funcin. Los
elementos de una tupla se pueden denominar por su nombre o por
nmero.
func calculateStatistics(scores: [Int]) -> (min: Int, max:
Int, sum: Int) { var min = scores[0] var max = scores[0] var sum =
0 for score in scores { if score > max { max = score } else if
score < min { min = score } sum += score } return (min, max,
sum) } let statistics = calculateStatistics([5, 3, 100, 3, 9])
statistics.sum statistics.2
Las funciones tambin pueden tomar un nmero variable de
argumentos, a su recogida en una matriz.
func sumOf(numbers: Int...) -> Int { var sum = 0 for number
in numbers { sum += number } return sum } sumOf() sumOf(42, 597,
12)
EXPERIMENTO Escriba una funcin que calcula el promedio de sus
argumentos. Las funciones pueden ser anidados. Funciones anidadas
tienen acceso a las variables que fueron declaradas en la funcin
externa. Puede utilizar las funciones anidadas para organizar el
cdigo en una funcin que es largo o complejo.
-
8
func returnFifteen() -> Int { var y = 10 func add() { y += 5
} add() return y } returnFifteen()
Las funciones son un tipo de primera clase. Esto significa que
una funcin puede devolver otra funcin como su valor.
func makeIncrementer() -> (Int -> Int) { func
addOne(number: Int) -> Int { return 1 + number } return addOne }
var increment = makeIncrementer() increment(7)
Una funcin puede tener otra funcin como uno de sus argumentos.
func hasAnyMatches(list: [Int], condition: Int -> Bool) ->
Bool { for item in list { if condition(item) { return true } }
return false } func lessThanTen(number: Int) -> Bool { return
number < 10 } var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
Las funciones son en realidad un caso especial de cierres:
bloques de cdigo que se pueden llamar ms tarde. El cdigo en un
cierre tiene acceso a cosas como las variables y funciones que
estaban disponibles en el mbito donde se cre el cierre, incluso si
el cierre es en un mbito diferente cuando se ejecuta-que viste un
ejemplo de esto ya con
-
9
funciones anidadas. Usted puede escribir un cierre sin nombre
rodeando cdigo con llaves ( {} ). Utilice en separar los argumentos
y el tipo de retorno del cuerpo.
numbers.map({ (number: Int) -> Int in let result = 3 * number
return result })
EXPERIMENTO Vuelva a escribir el cierre para volver a cero para
todos los nmeros impares. Usted tiene varias opciones para la
escritura de los cierres de forma ms concisa. Cuando el tipo de un
cierre que ya se conoce, por ejemplo, la devolucin de llamada de un
delegado, se puede omitir el tipo de sus parmetros, el tipo de
retorno, o ambos. Cierres sola instruccin implcitamente devuelven
el valor de su nica declaracin.
let mappedNumbers = numbers.map({ number in 3 * number })
mappedNumbers
Se puede hacer referencia a los parmetros de nmero en vez de por
su nombre-este enfoque es especialmente til en los cierres muy
cortos. Un cierre pasado como el ltimo argumento de la funcin puede
aparecer inmediatamente despus del parntesis.
let sortedNumbers = sorted(numbers) { $0 > $1 }
sortedNumbers
Objetos y clases Utilice la clase seguido del nombre de la clase
para crear una clase. Una declaracin de propiedad en una clase se
escribe de la misma manera como una declaracin de constante o
variable, excepto que es en el contexto de una clase. De igual
forma, mtodo y funcin declaraciones se escriben de la misma
manera.
class Shape { var numberOfSides = 0 func simpleDescription()
-> String { return "A shape with \(numberOfSides) sides." }
}
EXPERIMENTO Aadir una propiedad constante con let , y aadir otro
mtodo que toma un argumento. Crear una instancia de una clase,
poniendo entre parntesis despus del nombre de la clase. Utilice la
sintaxis con punto para acceder a las propiedades y mtodos de la
instancia.
var shape = Shape() shape.numberOfSides = 7
-
10
var shapeDescription = shape.simpleDescription() Esta versin de
la Forma clase le falta algo importante: un inicializador para
configurar la clase cuando se crea una instancia. Utilice init para
crear una.
class NamedShape { var numberOfSides: Int = 0 var name: String
init(name: String) { self.name = name } func simpleDescription()
-> String { return "A shape with \(numberOfSides) sides." }
}
Observe cmo auto se utiliza para distinguir el nombre de la
propiedad del nombre de argumento para el inicializador. Los
argumentos para el inicializador se pasan como una llamada a la
funcin cuando se crea una instancia de la clase. Cada propiedad
necesita un valor asignado, ya sea en su declaracin (como
connumberOfSides ) o en el inicializador (como con el nombre ).
Utilice deinit para crear un deinitializer si es necesario realizar
alguna tarea de limpieza antes de que se cancela la asignacin del
objeto. Las subclases incluyen su nombre despus de su superclase
nombre de la clase, separados por dos puntos.No hay ningn requisito
para las clases subclase cualquier clase raz estndar, por lo que
puede incluir u omitir una superclase, segn sea necesario. Los
mtodos en una subclase que anulan la implementacin de la superclase
estn marcados con el override-overriding un mtodo por el accidente,
sin anulacin , es detectado por el compilador como un error. El
compilador tambin detecta con mtodos de anulacin que en realidad no
anulan cualquier mtodo en la superclase.
class Square: NamedShape { var sideLength: Double
init(sideLength: Double, name: String) { self.sideLength =
sideLength super.init(name: name) numberOfSides = 4 } func area()
-> Double {
-
11
return sideLength * sideLength } override func
simpleDescription() -> String { return "A square with sides of
length \(sideLength)." } } let test = Square(sideLength: 5.2, name:
"my test square") test.area() test.simpleDescription()
EXPERIMENTO Haga otra subclase de NamedShape llamado Crculo que
tiene un radio y un nombre como argumentos a su inicializador.
Implementar un rea y un simpleDescription mtodo en el Crculo de
clase. Adems de las propiedades simples que se almacenan, las
propiedades pueden tener un getter y un setter.
class EquilateralTriangle: NamedShape { var sideLength: Double =
0.0 init(sideLength: Double, name: String) { self.sideLength =
sideLength super.init(name: name) numberOfSides = 3 } var
perimeter: Double { get { return 3.0 * sideLength } set {
sideLength = newValue / 3.0 } } override func simpleDescription()
-> String { return "An equilateral triangle with sides of length
\(sideLength)." }
-
12
} var triangle = EquilateralTriangle(sideLength: 3.1, name: "a
triangle") triangle.perimeter triangle.perimeter = 9.9
triangle.sideLength
En la incubadora de permetro , el nuevo valor tiene el nombre
implcito nuevoValor . Puede proporcionar un nombre explcito entre
parntesis despus de conjunto . Observe que el inicializador para la
EquilateralTriangle clase tiene tres etapas diferentes: 1.
Establecer el valor de las propiedades que la subclase declara. 2.
Llamando inicializador de la superclase. 3. Cambiar el valor de las
propiedades definidas por la superclase. Cualquier trabajo de
configuracin adicional que utiliza mtodos getters o setters
tambin se puede hacer en este momento.
Si no es necesario para calcular la propiedad, pero todava tiene
que proporcionar el cdigo que se ejecuta antes y despus de fijar un
nuevo valor, utilice willSet y didSet . Por ejemplo, la clase a
continuacin se asegura de que la longitud del lado de su tringulo
es siempre la misma que la longitud del lado de su cuadrado.
class TriangleAndSquare { var triangle: EquilateralTriangle {
willSet { square.sideLength = newValue.sideLength } } var square:
Square { willSet { triangle.sideLength = newValue.sideLength } }
init(size: Double, name: String) { square = Square(sideLength:
size, name: name) triangle = EquilateralTriangle(sideLength: size,
name: name) } } var triangleAndSquare = TriangleAndSquare(size: 10,
name: "another test shape") triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
-
13
triangleAndSquare.square = Square(sideLength: 50, name: "larger
square") triangleAndSquare.triangle.sideLength
Los mtodos de las clases tienen una diferencia importante de
funciones. Los nombres de parmetros en funciones slo se utilizan
dentro de la funcin, pero los parmetros nombres en los mtodos
tambin se utilizan cuando se llama al mtodo (excepto para el primer
parmetro). Por defecto, un mtodo tiene el mismo nombre para sus
parmetros cuando se llama a ella y dentro del mtodo en s. Se puede
especificar un segundo nombre, que se utiliza dentro del mtodo.
class Counter { var count: Int = 0 func incrementBy(amount: Int,
numberOfTimes times: Int) { count += amount * times } } var counter
= Counter() counter.incrementBy(2, numberOfTimes: 7)
Cuando se trabaja con valores opcionales, puede escribir ? antes
de las operaciones, como los mtodos, propiedades y subndices. Si el
valor antes de la ? es nula , todo despus de la ? se ignora y el
valor de toda la expresin es nula . De lo contrario, el valor es
opcional sin envolver, y todo despus de la ? acta sobre el valor de
envolver. En ambos casos, el valor de toda la expresin es un valor
opcional.
let optionalSquare: Square? = Square(sideLength: 2.5, name:
"optional square") let sideLength = optionalSquare?.sideLength
Las enumeraciones y estructuras Utilice enum para crear una
enumeracin. Al igual que las clases y todos los dems tipos con
nombre, enumeraciones pueden tener mtodos asociados con ellos.
enum Rank: Int { case Ace = 1 case Two, Three, Four, Five, Six,
Seven, Eight, Nine, Ten case Jack, Queen, King func
simpleDescription() -> String { switch self { case .Ace: return
"ace" case .Jack: return "jack" case .Queen: return "queen" case
.King:
-
14
return "king" default: return String(self.toRaw()) } } } let ace
= Rank.Ace let aceRawValue = ace.toRaw()
EXPERIMENTO Escriba una funcin que compara dos Rank valores
mediante la comparacin de sus valores brutos. En el ejemplo
anterior, el tipo de valor bruto de la enumeracin es int , por lo
que slo tiene que especificar el primer valor crudo. El resto de
los valores brutos se asignan en orden. Tambin puede utilizar
cadenas o nmeros de punto flotante como el tipo de prima de una
enumeracin. Utilice los toRaw y fromRaw funciones para convertir
entre el valor bruto y el valor de la enumeracin.
if let convertedRank = Rank.fromRaw(3) { let threeDescription =
convertedRank.simpleDescription() }
Los valores de los miembros de una enumeracin son valores
reales, no slo otra manera de escribir sus valores brutos. De
hecho, en los casos donde no hay un valor en bruto significativo,
usted no tiene que proporcionar una.
enum Suit { case Spades, Hearts, Diamonds, Clubs func
simpleDescription() -> String { switch self { case .Spades:
return "spades" case .Hearts: return "hearts" case .Diamonds:
return "diamonds" case .Clubs: return "clubs" } } } let hearts =
Suit.Hearts
-
15
let heartsDescription = hearts.simpleDescription() EXPERIMENTO
Agregar un color de mtodo para Suit que devuelve "negro" para
espadas y palos, y los retornos "rojos" de corazones y diamantes.
Observe las dos formas en que el Hearts miembro de la enumeracin se
hace referencia ms arriba: Al asignar un valor a los corazones
constantes, los miembros de enumeracin Suit.Hearts se refiere por
su nombre completo porque la constante no tiene un tipo explcito
especificado. En el interior del interruptor, la enumeracin es
referido por la forma abreviada .Hearts porque el valor del auto
que ya se sabe que es un juego. Usted puede utilizar el formulario
abreviado en cualquier momento el tipo del valor que ya se conoce.
Utilice struct para crear una estructura. Estructuras de soporte
para muchas de las mismas conductas como las clases, incluyendo
mtodos y inicializadores. Una de las diferencias ms importantes
entre las estructuras y las clases es que las estructuras siempre
se copian cuando se pasan alrededor en su cdigo, pero las clases se
pasan por referencia.
struct Card { var rank: Rank var suit: Suit func
simpleDescription() -> String { return "The
\(rank.simpleDescription()) of \(suit.simpleDescription())" } } let
threeOfSpades = Card(rank: .Three, suit: .Spades) let
threeOfSpadesDescription = threeOfSpades.simpleDescription()
EXPERIMENTO Agregue un mtodo para la tarjeta que crea una baraja
completa de tarjetas, con una carta de cada combinacin de rango y
palo. Una instancia de un miembro de la enumeracin puede tener
valores asociados con la instancia. Las instancias de la misma
miembro de enumeracin pueden tener diferentes valores asociados con
ellos. Usted proporciona los valores asociados al crear la
instancia. Valores asociados y valores primas son diferentes: El
valor bruto de un miembro de la enumeracin es el mismo para todas
sus instancias, y le proporcionar el valor en bruto cuando se
define la enumeracin. Por ejemplo, considere el caso de solicitar
el amanecer y el atardecer hora de un servidor. El servidor o bien
responde con la informacin o responde con un poco de informacin de
error.
enum ServerResponse { case Result(String, String) case
Error(String) }
-
16
let success = ServerResponse.Result("6:00 am", "8:09 pm") let
failure = ServerResponse.Error("Out of cheese.") switch success {
case let .Result(sunrise, sunset): let serverResponse = "Sunrise is
at \(sunrise) and sunset is at \(sunset)." case let .Error(error):
let serverResponse = "Failure... \(error)" }
EXPERIMENTO Aadir un tercer caso a ServerResponse y para el
interruptor. Observe cmo se extraen las horas de salida y puesta
del sol desde el ServerResponse valor como parte de hacer coincidir
el valor contra los casos de conmutacin. Protocolos y Extensiones
Utilice el protocolo para declarar un protocolo.
protocol ExampleProtocol { var simpleDescription: String { get }
mutating func adjust()
} Las clases, enumeraciones y estructuras de todo pueden adoptar
protocolos.
class SimpleClass: ExampleProtocol { var simpleDescription:
String = "A very simple class." var anotherProperty: Int = 69105
func adjust() { simpleDescription += " Now 100% adjusted." } } var
a = SimpleClass() a.adjust() let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol { var simpleDescription:
String = "A simple structure" mutating func adjust() {
simpleDescription += " (adjusted)" } }
-
17
var b = SimpleStructure() b.adjust() let bDescription =
b.simpleDescription
EXPERIMENTO Escribe una enumeracin que se ajusta a este
protocolo. Note el uso de la mutacin de la palabra clave en la
declaracin de SimpleStructure para marcar un mtodo que modifica la
estructura. La declaracin de SimpleClass no necesita ninguno de sus
mtodos marcados como mutando debido a los mtodos de una clase
siempre puede modificar la clase. Utilice la extensin para agregar
funcionalidad a un tipo existente, tales como nuevos mtodos y
propiedades calculadas. Puede utilizar una extensin para aadir
conformidad protocolo a un tipo que se declara en otro lugar, o
incluso a un tipo que ha importado de una biblioteca o un
marco.
extension Int: ExampleProtocol { var simpleDescription: String {
return "The number \(self)" } mutating func adjust() { self += 42 }
} 7.simpleDescription
EXPERIMENTO Escribe una extensin para el doble tipo, que aade un
absoluteValue propiedad. Puede utilizar un nombre de protocolo al
igual que cualquier otro ejemplo de tipo de llamada, para crear una
coleccin de objetos que tienen diferentes tipos, sino que todos
cumplir con un protocolo nico. Cuando se trabaja con valores cuyo
tipo es un tipo de protocolo, los mtodos fuera de la definicin de
protocolo no estn disponibles.
let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription // protocolValue.anotherProperty //
Uncomment to see the error
A pesar de que la variable protocolValue tiene un tipo de tiempo
de ejecucin de SimpleClass , el compilador lo trata como el tipo
dado de ExampleProtocol . Esto significa que no se puede acceder
accidentalmente a los mtodos o propiedades que la clase implementa
adems de su conformidad protocolo. Genricos Escriba un nombre
dentro de parntesis angulares para hacer una funcin genrica o
tipo.
func repeat(item: ItemType, times: Int) -> [ItemType] { var
result = [ItemType]() for i in 0..
-
18
result.append(item) } return result } repeat("knock", 4)
Usted puede hacer las formas genricas de las funciones y mtodos,
as como las clases, enumeraciones y estructuras.
// Reimplementar tipo opcional de la biblioteca estndar de
Swift
enum OptionalValue { case None case Some(T) } var
possibleInteger: OptionalValue = .None possibleInteger =
.Some(100)
Use where after the type name to specify a list of
requirementsfor example, to require the type to implement a
protocol, to require two types to be the same, or to require a
class to have a particular superclass.
func anyCommonElements (lhs: T, rhs: U) -> Bool {
for lhsItem in lhs { for rhsItem in rhs { if lhsItem == rhsItem
{ return true } } } return false } anyCommonElements([1, 2, 3],
[3]) anyCommonElements ([ 1 , 2 , 3 ], [ 3 ])
EXPERIMENTO Modifique el anyCommonElements funcin para realizar
una funcin que devuelve una matriz de los elementos que las dos
secuencias tienen en comn. En los casos sencillos, se puede omitir
cuando y simplemente escriba el nombre del protocolo o de clase
despus de dos puntos. Escribiendo es lo mismo que escribir .
-
19
Los Fundamentos En esta pgina Swift es un nuevo lenguaje de
programacin para iOS y OS X de desarrollo de aplicaciones. No
obstante, muchas partes de Swift estarn familiarizados desde su
experiencia en el desarrollo en C y Objective-C. Swift proporciona
sus propias versiones de todos los tipos C y Objective-C
fundamentales, incluido Int para enteros, doble y flotador para los
valores de punto flotante, Bool para valores booleanos y de cadena
para los datos textuales. Swift tambin ofrece versiones potentes de
los dos tipos de recoleccin primaria, matriz yDiccionario , como se
describe en Tipos Collection . Al igual que C, Swift utiliza
variables para almacenar y hacer referencia a los valores por un
nombre de identificacin. Swift tambin hace un amplio uso de
variables cuyos valores no se pueden cambiar. Estos son conocidos
como constantes, y son mucho ms poderosos que las constantes en C.
Las constantes se utilizan a lo largo Swift para hacer el cdigo ms
seguro y ms clara en su intencin cuando se trabaja con valores que
no tienen que cambiar. Adems de los tipos conocidos, Swift presenta
tipos avanzadas que no se encuentran en Objective-C, como tuplas.
Tuples le permiten crear y pasar alrededor de agrupaciones de
valores. Puede usar una tupla para devolver varios valores de una
funcin como un valor nico compuesto. Swift tambin introduce tipos
opcionales, que se encargan de la ausencia de un valor. Opcionales
dicen bien "no es un valor, y que es igual a x "o" no , no es un
valor en absoluto ". Opcionales son similares al uso de nilcon
punteros en Objective-C, pero trabajan para cualquier tipo, no slo
a las clases. Opcionales son ms seguros y ms expresiva que nil
punteros en Objective-C y estn en el centro de muchas de las
caractersticas ms poderosas de Swift. Opcionales son un ejemplo del
hecho de que Swift es un seguro de tipo de idioma. Swift le ayuda a
ser claro acerca de los tipos de valores de su cdigo puede
trabajar. Si parte de su cdigo espera una cuerda , la seguridad de
tipos le impide pasndole un Int por error. Esta restriccin le
permite capturar y corregir los errores lo antes posible en el
proceso de desarrollo. Constantes y Variables Constantes y
variables asociar un nombre (como maximumNumberOfLoginAttempts o
WelcomeMessage ) con un valor de un tipo concreto (por ejemplo, el
nmero 10 o la cadena "Hola" ). El valor de una constante no se
puede cambiar una vez que se establece, mientras que una variable
de puede ajustarse a un valor diferente en el futuro. Declaracin de
constantes y variables Constantes y variables deben ser declaradas
antes de ser utilizadas. Usted declara constantes con la let de
palabras clave y las variables con la var palabra clave. He aqu un
ejemplo de cmo las constantes y las variables se pueden utilizar
para realizar el seguimiento del nmero de intentos de inicio de
sesin de un usuario ha hecho:
let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt =
0
Este cdigo se puede leer como:
-
20
"Declarar una nueva constante llamada
maximumNumberOfLoginAttempts , y darle un valor de 10 . A
continuacin, declarar una nueva variable llamada
currentLoginAttempt , y darle un valor inicial de 0 ". En este
ejemplo, el nmero mximo de intentos de inicio de sesin permitidos
se declara como una constante, debido a que el valor mximo nunca
cambia. El contador de inicio de sesin actual intento se declara
como una variable, ya que este valor debe ser incrementado despus
de cada intento fallido de inicio de sesin. Se pueden declarar
varias constantes o variables mltiples en una misma lnea, separados
por comas:
var x = 0,0 , y = 0,0 , z = 0,0 N O T A Si un valor almacenado
en el cdigo no va a cambiar, siempre declararemos como una
constante con la letpalabra clave. Utilice variables slo para
almacenar valores que deben ser capaces de cambiar. Tipo
Anotaciones Puede proporcionar una anotacin de tipo cuando se
declara una constante o variable, para tener claro el tipo de
valores de la tienda lata constante o variable. Escribe una
anotacin de tipo mediante la colocacin de dos puntos despus del
nombre de la constante o variable, seguido por un espacio, seguido
por el nombre del tipo de usar. Este ejemplo proporciona una
anotacin de tipo para una variable llamada WelcomeMessage , para
indicar que la variable puede almacenar de Cuerda valores:
var welcomeMessage: String Los dos puntos en la declaracin
significa "... el tipo ...", por lo que el cdigo anterior se puede
leer como: "Declarar una variable llamada WelcomeMessage que es del
tipo String. " La frase "de tipo String "significa" puede almacenar
cualquier Cadena de valor. "Piense en ello como que significa" el
tipo de cosas "(o" el tipo de cosa ") que se puede almacenar. El
WelcomeMessage variables ahora se puede ajustar a cualquier valor
de cadena sin error:
WelcomeMessage = "Hola" Puede definir mltiples variables
relacionadas del mismo tipo en una sola lnea, separados por comas,
con un solo tipo de anotacin despus de que el nombre de la variable
definitiva:
var red, green, blue: Double N O T A Es raro que usted necesita
para escribir anotaciones de tipo en la prctica. Si proporciona un
valor inicial para una constante o variable en el punto que se
define, Swift casi siempre se puede inferir el tipo que se utilizar
para que constante o variable, como se describe en el tipo de
seguridad y la inferencia de tipos . En la WelcomeMessage ejemplo
anterior, no se proporciona ningn valor inicial, por lo que el tipo
de laWelcomeMessage variable se especifica con una anotacin de tipo
en lugar de ser inferido a partir de un valor inicial.
-
21
Nombrar constantes y variables Los nombres de constantes y
variables pueden contener casi cualquier carcter, incluidos los
caracteres Unicode:
let = 3.14159 let = ""
let = "dogcow" Los nombres de constantes y variables no pueden
contener espacios en blanco, smbolos matemticos, flechas, de uso
privado (o no vlidos) los puntos de cdigo Unicode o caracteres de
lnea y caja de dibujo.Tampoco pueden comenzar con un nmero, aunque
las cifras pueden ser incluidos en otro lugar dentro del nombre.
Una vez que se ha declarado una constante o variable de un cierto
tipo, no se puede redeclare de nuevo con el mismo nombre, o
cambiarlo para almacenar valores de un tipo diferente. Tampoco se
puede cambiar una constante en una variable o una variable en una
constante. N O T A Si usted necesita dar una constante o variable
el mismo nombre que una palabra clave reservada Swift, rodear la
palabra clave con la espalda garrapatas ( ` ) cuando se utiliza
como un nombre. Sin embargo, evite el uso de palabras clave como
nombres a menos que tenga absolutamente ninguna opcin. Puede
cambiar el valor de una variable existente a otro valor de un tipo
compatible. En este ejemplo, el valor de friendlyWelcome se cambia
de "Hola!" a "Bonjour!" :
var friendlyWelcome = "Hello!" friendlyWelcome = "Bonjour!" //
friendlyWelcome is now "Bonjour!"
A diferencia de una variable, el valor de una constante no se
puede cambiar una vez que se establece. Si lo intenta, se reporta
como un error cuando se compila el cdigo:
let languageName = "Swift" languageName = "Swift++"
// Se trata de un error de tiempo de compilacin - languageName
no se puede cambiar Constantes de impresin y variables Usted puede
imprimir el valor actual de una constante o variable con el println
funcin:
println(friendlyWelcome) // prints "Bonjour!" println es una
funcin global que imprime un valor, seguido por un salto de lnea, a
una salida apropiada. En Xcode, por ejemplo, println imprime su
salida en el panel de "consola" de Xcode. (Una segunda funcin, la
impresin , realiza la misma tarea sin anexar un salto de lnea al
final del valor que se va a imprimir.) El println funcin imprime
cualquier Cadena de valor se pasa a la misma:
println("This is a string")
-
22
// prints "This is a string" El println funcin puede imprimir
mensajes de registro ms complejos, de una manera similar a la de
CocoaNSLog funcin. Estos mensajes pueden incluir los valores
actuales de constantes y variables. Swift utiliza interpolacin de
cadenas para incluir el nombre de una constante o variable como un
marcador de posicin en una cadena ms larga, ya una pronta Swift
sustituirlo por el valor actual de esa constante o variable.
Envuelva el nombre entre parntesis y escapar con una barra
invertida antes del parntesis de apertura:
println("The current value of friendlyWelcome is
\(friendlyWelcome)") // Impresiones "El valor actual de
friendlyWelcome es Bonjour!" N O T A Todas las opciones que puede
utilizar con la interpolacin de cadenas se describen en la Cadena
de interpolacin . Comentarios Utilice los comentarios para incluir
texto no ejecutable en su cdigo, como una nota o un recordatorio a
s mismo. Los comentarios son ignorados por el compilador Swift
cuando se compila el cdigo. Comentarios en Swift son muy similares
a los comentarios en C. sola lnea Los comentarios comienzan con dos
barras inclinadas (forward- // ):
// Esto es un comentario Los comentarios multilnea empiezan con
una barra inclinada seguida de un asterisco ( / * ) y terminan con
un asterisco seguido de una barra diagonal ( * / ):
/ * Este es tambin un comentario, pero escrito en varias lneas *
/
A diferencia de los comentarios de varias lneas en C, los
comentarios de varias lneas en Swift se pueden anidar dentro de
otros comentarios multilnea. Usted escribe comentarios anidados por
iniciar un bloque de varias lneas de comentarios y luego iniciar un
segundo comentario de varias lneas en el primer bloque. El segundo
bloque se cierra a continuacin, seguido por el primer bloque:
/ * Este es el comienzo de la primera comentario multilnea / *
Esta es la segunda, comentario de varias lneas anidada * /
este es el final de la primera comentario multilnea * /
Comentarios multilnea anidadas permiten a comentar a cabo grandes
bloques de cdigo de forma rpida y sencilla, incluso si el cdigo
contiene ya los comentarios de varias lneas. Punto y coma A
diferencia de muchos otros idiomas, Swift no requiere que usted
escriba un punto y coma ( ; ) despus de cada sentencia en el cdigo,
aunque puede hacerlo si lo desea. Los puntos y comas se requiere,
sin embargo, si desea escribir varias instrucciones separadas en
una sola lnea:
let cat = ""; println(cat)
-
23
// prints "" Enteros Los enteros son nmeros enteros sin
componente fraccional, como 42 y -23 . Los nmeros enteros se
seafirmado (positivo, cero o negativo) o sin signo (positivo o
cero). Swift proporciona firmado y enteros sin signo de 8, 16, 32 y
64 forma de bits. Estos enteros siguen una convencin de
nomenclatura similar a C, en que un entero sin signo de 8 bits es
de tipo Uint8 , y un entero con signo de 32 bits es de tipo Int32 .
Al igual que todos los tipos de Swift, estos tipos enteros tienen
nombres propios. Entero lmites Usted puede acceder a los valores
mnimo y mximo de cada tipo entero con su min y max propiedades:
let minValue = UInt8.min // minValue is equal to 0, and is of
type UInt8 let maxValue = UInt8.max // maxValue is equal to 255,
and is of type UInt8
Los valores de estas propiedades son del tipo de nmero de tamao
apropiado (tales como Uint8 en el ejemplo anterior) y por lo tanto
se pueden utilizar en expresiones junto con otros valores del mismo
tipo. Int En la mayora de los casos, usted no tiene que elegir un
tamao especfico de nmero entero para utilizar en su cdigo. Swift
proporciona un tipo entero adicional, Int , que tiene el mismo
tamao que el tamao de palabra nativa de la plataforma actual: En
una plataforma de 32 bits, Int es del mismo tamao que Int32 . En
una plataforma de 64 bits, Int es del mismo tamao que Int64 . A
menos que usted necesita para trabajar con un tamao especfico de
nmero entero, utilice siempre Intpara valores enteros en el cdigo.
Esto ayuda cdigo de coherencia y la interoperabilidad. Incluso en
las plataformas de 32 bits, Int puede almacenar cualquier valor
entre -2147483648 y 2147483647 , y es lo suficientemente grande
para muchos rangos enteros. UInt Swift tambin proporciona un tipo
entero sin signo, UInt , que tiene el mismo tamao que el tamao de
palabra nativa de la plataforma actual: En una plataforma de 32
bits, UInt es del mismo tamao que UInt32 . En una plataforma de 64
bits, UInt es del mismo tamao que UInt64 . N O T A Uso UInt slo
cuando se necesita especficamente un tipo entero sin signo con el
mismo tamao que el tamao de palabra nativa de la plataforma. Si
este no es el caso, Int se prefiere, incluso cuando los valores a
ser almacenados son conocidos por ser no negativo. Un uso
consistente de Int para el cdigo de ayudas valores enteros
interoperabilidad, evita la necesidad de convertir entre diferentes
tipos de nmeros, y coincide con el tipo entero de inferencia, como
se describe en el tipo de seguridad y tipo de inferencia . Nmeros
de punto flotante Nmeros de coma flotante son nmeros con un
componente fraccional, como 3.14159 , 0.1 , y -273.15 . Tipos de
punto flotante pueden representar una gama mucho ms amplia de
valores que los tipos enteros, y pueden almacenar nmeros que son
mucho ms grandes o ms
-
24
pequeos que se pueden almacenar en unint . Swift proporciona dos
tipos de nmeros de punto flotante firmados: Doble representa un
nmero de punto flotante de 64 bits. selo cuando los valores
de punto flotante deben ser muy grandes o particularmente
precisa. Float representa un nmero de punto flotante de 32 bits.
selo cuando los valores
de punto flotante no requieren precisin de 64 bits. N O T A
Doble tiene una precisin de al menos 15 dgitos decimales, mientras
que la precisin de flotador puede ser tan poco como 6 dgitos
decimales. El tipo de punto flotante apropiado utilizar depende de
la naturaleza y el rango de valores que necesita para trabajar en
su cdigo. Escriba Seguridad y tipo de inferencia Swift es un seguro
de tipo de idioma. Un lenguaje de tipo seguro anima a ser claro
acerca de los tipos de valores de su cdigo puede trabajar. Si parte
de su cdigo espera una cuerda , no se puede pasar un int por error.
Debido Swift es un tipo seguro, realiza escribir cheques al
compilar el cdigo y banderas cualesquiera tipos no coincidentes
como errores. Esto le permite capturar y corregir los errores lo
antes posible en el proceso de desarrollo. Tipo de comprobacin le
ayuda a evitar errores cuando se trabaja con diferentes tipos de
valores. Sin embargo, esto no significa que usted tiene que
especificar el tipo de cada constante y variable que se declara. Si
no se especifica el tipo de valor que necesita, Swift utiliza la
inferencia de tipos para calcular el tipo apropiado. La inferencia
de tipos permite un compilador para deducir el tipo de una expresin
concreta de forma automtica cuando se compila el cdigo, simplemente
mediante el examen de los valores suministrados por el usuario.
Debido a la inferencia de tipos, Swift requiere muchos menos
declaraciones de tipo que lenguajes como C o Objective-C.
Constantes y variables todava se escriben de forma explcita, pero
gran parte del trabajo de especificar su tipo est hecho para usted.
La inferencia de tipos es particularmente til cuando se declara una
constante o variable con un valor inicial.Esto se suele hacer
mediante la asignacin de un valor literal (o literal ) a la
constante o variable en el punto que se declara. (Un valor literal
es un valor que aparece directamente en el cdigo fuente, como 42 y
3,14159en los ejemplos a continuacin.) Por ejemplo, si se asigna un
valor literal de 42 a una nueva constante sin decir de qu tipo es,
Swift infiere que desea que la constante de ser un int , porque
usted ha inicializado con un nmero que se ve como un entero:
let meaningOfLife = 42 // MeaningOfLife se infiere a ser de tipo
Int
Del mismo modo, si no se especifica un tipo de un literal de
coma flotante, Swift infiere que desea crear undoble :
let pi = 3.14159 // Pi se infiere a ser de tipo doble
Swift siempre elige doble (en lugar de Float ) cuando inferir el
tipo de nmeros en coma flotante.
-
25
Si combina enteros y de punto flotante literales en una
expresin, un tipo de doble ser inferirse del contexto:
let anotherPi = 3 + 0.14159 // AnotherPi tambin se infiere a ser
de tipo doble
El valor literal de 3 tiene ningn tipo explcito en y de s mismo,
y por lo tanto un tipo de salida apropiado deDoble se infiere de la
presencia de un literal de coma flotante como parte de la adicin.
Los literales numricos Literales enteros se pueden escribir como:
Un decimal nmero, sin el prefijo Un binario nmero, con un 0b
prefijo Un octal nmero, con un 0o prefijo A hexadecimal nmero, con
un 0x prefijo Todos estos literales enteros tienen un valor decimal
de 17 :
let decimalInteger = 17 let binaryInteger = 0b10001 // 17 in
binary notation let octalInteger = 0o21 // 17 in octal notation let
hexadecimalInteger = 0x11 // 17 in hexadecimal notation
Literales de punto flotante pueden ser decimal (sin prefijo) o
hexadecimal (con un 0x prefijo). Ellos siempre deben tener un nmero
(o nmero hexadecimal) en ambos lados de la coma decimal. Tambin
pueden tener un opcional exponente , indicada por una mayscula o
minscula e para carrozas decimales, o una mayscula o minscula p
para carrozas hexadecimales. Para los nmeros decimales con un
exponente de exp , el nmero base se multiplica por 10 exp : 1.25e2
significa 1.25 10 2 , o 125,0 . 1.25E-2 significa 1,25 10 -2 , o
0,0125 . Para los nmeros hexadecimales con un exponente de exp , el
nmero base se multiplica por 2 exp : 0xFp2 significa 15 2 2 , o
60.0 . 0xFp-2 significa 15 2 -2 , o 3,75 . Todos estos literales de
punto flotante tienen un valor decimal de 12.1875 :
let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let
hexadecimalDouble = 0xC.3p0
Los literales numricos pueden contener un formato extra para que
sean ms fciles de leer. Ambos nmeros enteros y flotadores pueden
ser rellenados con ceros adicionales y pueden contener guiones
bajos para ayudar con la lectura. Ningn tipo de formato afecta el
valor subyacente de la literal:
let paddedDouble = 000123.456
-
26
let oneMillion = 1_000_000 let justOverOneMillion =
1_000_000.000_000_1
Tipo de conversin numrica Utilice la Int tipo para todas las
constantes de enteros de propsito general y variables en su cdigo,
aunque son conocidos por ser no negativo. Utilizando el tipo de
entero por defecto en situaciones cotidianas significa que
constantes enteras y variables son inmediatamente interoperable en
el cdigo y se corresponda con el tipo inferido para valores enteros
literales. Utilice otros tipos enteros slo cuando son
especficamente necesarios para la tarea en cuestin, debido a los
datos de forma explcita tamao de una fuente externa, o para el
funcionamiento, uso de memoria, u otro optimizacin necesaria. El
uso de tipos explcita tamao en estas situaciones ayuda a detectar
cualquier desbordamientos de valor accidentales y documenta
implcitamente la naturaleza de los datos que se utiliza. Entero
Conversin El rango de nmeros que pueden ser almacenadas en una
constante entera o variable es diferente para cada tipo numrico. Un
INT8 constante o variable pueden almacenar nmeros entre -128 y 127
, mientras que unUint8 constante o variable pueden almacenar nmeros
entre 0 y 255 . Un nmero que no caben en una constante o variable
de un tipo entero de tamao se indica como un error cuando se
compila el cdigo:
let cannotBeNegative: UInt8 = -1 // Uint8 no puede almacenar
nmeros negativos, por lo que esta informar de un error
let tooBig: Int8 = Int8.max + 1 // INT8 no puede almacenar un
nmero mayor que su valor mximo,
// Y por lo que este tambin informar de un error Debido a que
cada tipo numrico puede almacenar una serie diferente de valores,
debe optar por la conversin de tipo numrico sobre una base caso por
caso. Este enfoque opt-in evita errores de conversin ocultos y
ayuda a que las intenciones de conversin de tipo explcita en el
cdigo. Para convertir un tipo determinado nmero a otro, se
inicializa un nuevo nmero del tipo deseado con el valor existente.
En el siguiente ejemplo, la constante de twoThousand es de tipo
UInt16 , mientras que la constante de uno es de tipo Uint8 . No se
pueden sumar directamente, porque no son del mismo tipo. En cambio,
este ejemplo llama UInt16 (uno) para crear una nueva UInt16
inicializado con el valor de uno , y utiliza este valor en lugar de
la original:
let twoThousand: UInt16 = 2_000 let one: UInt8 = 1 let
twoThousandAndOne = twoThousand + UInt16(one)
-
27
Debido a que ambos lados de la adicin son ahora de tipo UInt16 ,
se permite la adicin. La constante de salida ( twoThousandAndOne )
se infiere a ser de tipo UInt16 , porque es la suma de dos UINT16
valores. SomeType (ofInitialValue) es la forma predeterminada para
llamar al inicializador de tipo Swift y pase un valor inicial.
Detrs de las escenas, UInt16 tiene un inicializador que acepta un
Uint8 valor, y por lo que este inicializador se utiliza para hacer
un nuevo UInt16 de una existente Uint8 . No se puede pasar en
cualquiertipo aqu, sin embargo, tiene que ser un tipo para el que
UInt16 proporciona un inicializador. La extensin de los tipos
existentes para proporcionar inicializadores que acepten nuevos
tipos (incluyendo sus propias definiciones de tipos) que se cubre
en las extensiones . Entero y en coma flotante Conversin Las
conversiones entre nmeros enteros y de punto flotante tipos
numricos deben hacerse explcitas:
let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi =
Double(three) + pointOneFourOneFiveNine
// Pi es igual a 3.14159, y se infiere a ser de tipo doble Aqu,
el valor de la constante de tres se utiliza para crear un nuevo
valor de tipo doble , de modo que ambos lados de la adicin son del
mismo tipo. Sin esta conversin en su lugar, la adicin no se le
permitira. De punto flotante de conversin entera tambin debe
hacerse explcito. Un tipo entero se puede inicializar con un doble
o Float valor:
let integerPi = Int(pi) // IntegerPi es igual a 3, y se infiere
a ser de tipo Int
Los valores de coma flotante siempre se truncan cuando se
utiliza para inicializar un nuevo valor de nmero entero de esta
manera. Esto significa que 4,75 se convierte en 4 , y -3,9
convierte -3 . N O T A Las reglas para combinar las constantes
numricas y variables son diferentes de las reglas para los
literales numricos. El valor literal 3 se puede agregar
directamente al valor literal 0.14159 , porque literales numricos
no tienen un tipo explcito en s mismos. Su tipo es inferido slo en
el punto de que son evaluados por el compilador. Tipo de los
nombres Tipo alias definen un nombre alternativo para un tipo
existente. Usted define los alias de tipo con el typealiaspalabra
clave. Tipo alias son tiles cuando se quiere hacer referencia a un
tipo existente por un nombre que es contextualmente ms apropiado,
por ejemplo, cuando se trabaja con datos de un tamao especfico de
una fuente externa:
typealias AudioSample = UInt16 Una vez que se define un alias de
tipo, puede utilizar el alias de cualquier lugar que podra utilizar
el nombre original:
var maxAmplitudeFound = AudioSample.min
-
28
// MaxAmplitudeFound es ahora 0 Aqu, AudioSample se define como
un alias para UInt16 . Debido a que es un alias, la llamada
aAudioSample.min llama en realidad UInt16.min , que proporciona un
valor inicial de 0 para el maxAmplitudeFoundvariable. Booleanos
Swift tiene un bsico de Boole tipo, llamado Bool . Los valores
booleanos se les conoce como lgica , ya que slo alguna vez pueden
ser verdaderas o falsas. Swift proporciona dos valores constantes
booleanas,verdaderas y falsas :
let orangesAreOrange = true let turnipsAreDelicious = false
Los tipos de orangesAreOrange y turnipsAreDelicious se han
deducido como Bool del hecho de que se inicializan con valores
literales booleanos. Al igual que con Int y doble arriba, usted no
tiene que declarar constantes o variables como Bool Si se ajustan a
la verdad o falso tan pronto a medida que los crea. La inferencia
de tipos ayuda a que el cdigo Swift ms concisa y fcil de leer
cuando se inicializa las constantes o variables con otros valores
cuyo tipo ya se conoce. Los valores booleanos son particularmente
tiles cuando se trabaja con sentencias condicionales tales como el
caso de la declaracin:
if turnipsAreDelicious { println("Mmm, tasty turnips!") } else {
println("Eww, turnips are horrible.") } // prints "Eww, turnips are
horrible."
Sentencias condicionales tales como el caso de la declaracin se
cubren con ms detalle en el control de flujo. Seguridad de tipos de
Swift evita valores no booleanos de ser sustituido por Bool . El
siguiente ejemplo se informa de un error de tiempo de
compilacin:
let i = 1 if i {
// Este ejemplo no se compilar, y se informar de un error }
Sin embargo, el ejemplo alternativo a continuacin es vlido: let
i = 1 if i == 1 {
// Este ejemplo se compilar con xito }
El resultado de la i == 1 comparacin es de tipo Bool , y por lo
que este segundo ejemplo del tipo pasa-cheque. Las comparaciones
como i == 1 se discuten en Operadores bsicos .
-
29
Al igual que con otros ejemplos de tipo de seguridad en Swift,
este enfoque evita errores accidentales y asegura que la intencin
de una seccin particular de cdigo es siempre clara. Las tuplas Las
tuplas grupo de valores mltiples en un nico valor compuesto. Los
valores dentro de una tupla pueden ser de cualquier tipo y no
tienen que ser del mismo tipo que la otra. En este ejemplo, (404,
"Not Found") es una tupla que describe un cdigo de estado HTTP . Un
cdigo de estado HTTP es un valor especial retornado por un servidor
web cada vez que solicita una pgina web. Un cdigo de estado de 404
Not Found se devuelve si usted solicita una pgina web que no
existe.
let http404Error = (404, "Not Found") // Http404Error es de tipo
(int, String), y es igual a (404, "Not Found") El (404, "Not
Found") grupos de tupla juntos un Int y una cadena para dar el
cdigo de estado HTTP dos valores distintos: un nmero y una
descripcin legible. Puede ser descrito como "una tupla de tipo
(int, String) ". Puede crear tuplas de cualquier permutacin de
tipos, y que puede contener muchos tipos diferentes como desee. No
hay nada que nos impida tener una tupla de tipo (Int, Int, Int) , o
(String, Bool) , o de hecho cualquier otra permutacin usted
requiere. Puede descomponer el contenido de una tupla en constantes
o variables independientes, que luego accede como de costumbre:
let (statusCode, statusMessage) = http404Error println("The
status code is \(statusCode)") // prints "The status code is 404"
println("The status message is \(statusMessage)") // prints "The
status message is Not Found"
Si slo necesita algunos de los valores de la tupla, ignorar
partes de la tupla con un guin bajo ( _ ) cuando se descompone la
tupla:
let (justTheStatusCode, _) = http404Error println("The status
code is \(justTheStatusCode)") // prints "The status code is
404"
Alternativamente, acceder a los valores de los elementos
individuales de una tupla usando nmeros de ndice a partir de
cero:
println("The status code is \(http404Error.0)") // prints "The
status code is 404" println("The status message is
\(http404Error.1)") // prints "The status message is Not Found"
// Impresiones "El mensaje de estado no se encuentra" Usted
puede nombrar a los elementos individuales de una tupla cuando se
define la tupla:
-
30
dejar http200Status = ( statuscode : 200 , Descripcin : "OK" )
Si el nombre de los elementos de una tupla, puede utilizar los
nombres de los elementos para tener acceso a los valores de esos
elementos:
println("The status code is \(http200Status.statusCode)") //
prints "The status code is 200" println("The status message is
\(http200Status.description)") // prints "The status message is
OK"
Las tuplas son particularmente tiles como los valores de retorno
de las funciones. Una funcin que intenta recuperar una pgina web
puede devolver el (Int, String) Tipo de tupla para describir el
xito o el fracaso de la recuperacin de la pgina. Al devolver una
tupla con dos valores distintos, cada uno de un tipo diferente, la
funcin proporciona informacin ms til sobre su resultado que si slo
poda devolver un solo valor de un solo tipo. Para obtener ms
informacin, vea Funciones con mltiples valores de retorno . N O T A
Las tuplas son tiles para los grupos temporales de valores
relacionados. No son adecuados para la creacin de estructuras de
datos complejas. Si es probable que persistan ms all de un alcance
temporal, lo representan como una clase o estructura, ms que como
una tupla de su estructura de datos. Para obtener ms informacin,
vea Clases y Estructuras . Opcionales Utiliza opcionales en
situaciones en que un valor puede estar ausente. Un opcional dice:
No es un valor, y es igual a x o All no es un valor en absoluto N O
T A El concepto de opcionales no existe en C o Objective-C. Lo ms
cercano en Objective-C es la capacidad de volver a cero de un mtodo
que de otra manera devolver un objeto, con nula que significa "la
ausencia de un objeto vlido." Sin embargo, esto slo funciona para
los objetos-no funciona para las estructuras , tipos bsicos de C, o
valores de enumeracin. Para estos tipos, mtodos de Objective-C
normalmente devuelven un valor especial (como NSNotFound ) para
indicar la ausencia de un valor. Este enfoque asume que la persona
que llama del mtodo sabe que hay un valor especial para probar en
contra y recuerda a comprobar por ello. Opcionales de Swift
permiten indicar la ausencia de un valor de cualquier tipo en
absoluto , sin la necesidad de constantes especiales. He aqu un
ejemplo de cmo opcionales pueden utilizarse para hacer frente a la
ausencia de un valor. De Swift Cadena tipo tiene un mtodo llamado
Toint , que trata de convertir una Cadena de valor en un Int
valor.Sin embargo, no todos los cadena se puede convertir en un
entero. La cadena "123" se puede convertir en el valor numrico 123
, pero la cadena "hola, mundo" no tiene un valor numrico obvio para
convertir. El ejemplo siguiente utiliza la Toint mtodo para tratar
de convertir una cuerda en un Int :
-
31
let possibleNumber = "123" let convertedNumber =
possibleNumber.toInt()
// ConvertedNumber se infiere a ser de tipo "Int?", O "Int
opcional" Debido a que el Toint mtodo puede fallar, devuelve un
opcional Int , en lugar de un int . Un opcional Int se escribe como
Int? , no Int . El signo de interrogacin indica que el valor que
contiene es opcional, lo que significa que puede contener algn Int
valor, o podra contener ningn valor en absoluto . (No puede
contener cualquier otra cosa, como por ejemplo un Bool valor o una
Cadena de valor. Es o un int , o no es nada en absoluto.) nil Se
establece una variable opcional a un estado sin valor asignndole el
valor especial nulo :
var serverResponseCode: Int? = 404 // ServerResponseCode
contiene un valor real Int de 404 serverResponseCode = nil //
ServerResponseCode ahora no contiene ningn valor
N O T A nil no se puede utilizar con constantes y variables no
opcional. Si una constante o variable en el cdigo tiene que
trabajar con la ausencia de un valor bajo ciertas condiciones,
siempre declararemos como un valor opcional del tipo apropiado. Si
se define una constante o variable opcional sin proporcionar un
valor por defecto, la constante o variable se ajusta automticamente
a cero para usted:
var surveyAnswer : Cadena ? // SurveyAnswer se ajusta
automticamente a cero
N O T A De Swift nil no es lo mismo que cero en Objective-C. En
Objective-C, nil es un puntero a un objeto inexistente. En Swift,
nil no es un puntero-es la ausencia de un valor de un cierto tipo.
Opcionales decualquier tipo se pueden establecer en cero , no slo
tipos de objetos. Si Las declaraciones y forzado Unwrapping Puede
utilizar un si declaracin para averiguar si un opcional contiene un
valor comparando el opcional contra cero . Se realiza esta
comparacin con la "igual a" operador ( == ) o el "no es igual a"
operador ( ! = ). Si una opcin tiene un valor, se considera que "no
es igual a" cero :
if convertedNumber != nil { println("convertedNumber contains
some integer value.") } // prints "convertedNumber contains some
integer value."
Una vez que est seguro de que la opcional hace contener un
valor, puede acceder a su valor subyacente mediante la adicin de un
signo de exclamacin ( ! ) al final del nombre de la opcin. El signo
de exclamacin efectivamente dice, "Yo s que esta
-
32
opcin sin duda tiene un valor; por favor use "Esto se conoce
como.desenvolver forzado del valor de la opcin:
if convertedNumber != nil { println("convertedNumber has an
integer value of \(convertedNumber!).") }
// Impresiones "convertedNumber tiene un valor entero de 123"
Para ms informacin sobre el caso de la declaracin, vase el control
de flujo . N O T A Tratar de utilizar ! acceder a un valor opcional
inexistente provoca un error de ejecucin. Asegrese siempre de que
un opcional contiene una no- nil valor antes de usar !
forzar-desenvolver su valor. Opcional Binding Utiliza unin opcional
para averiguar si un opcional contiene un valor, y si es as, haga
que el valor disponible como una constante o variable temporal.
Opcional unin se puede utilizar con si y mientras declaraciones
para comprobar un valor dentro de un opcional, y para extraer ese
valor en una constante o variable, como parte de una sola accin. si
y mientras estados se describen con ms detalle en el control de
flujo . Escribe enlaces opcionales para el caso de la declaracin de
la siguiente manera:
if let constantName = someOptional {
statements
} Puede volver a escribir la possibleNumber ejemplo del
Opcionales seccin para utilizar opcional desenvolver vinculante y
no forzada:
if let actualNumber = possibleNumber.toInt() {
println("\(possibleNumber) has an integer value of
\(actualNumber)") } else { println("\(possibleNumber) could not be
converted to an integer") } // prints "123 has an integer value of
123"
Este cdigo se puede leer como: "Si el opcional Int devuelve
possibleNumber.toInt contiene un valor, establece una nueva
constante llamadaactualNumber al valor contenido en la opcional. "
Si la conversin se realiza correctamente, el actualNumber constante
est disponible para su uso dentro de la primera rama del si
comunicado. Ya se ha inicializado con el valor contenido dentro de
la opcional, y as que no hay necesidad de utilizar el ! sufijo para
acceder a su valor. En este ejemplo, actualNumber se utiliza
simplemente para imprimir el resultado de la conversin. Puede
utilizar ambas constantes y variables con opcin de encuadernacin.
Si quera manipular el valor deactualNumber dentro de la primera
rama del si declaracin,
-
33
usted podra escribir si actualNumber var su lugar, y el valor
contenido en el opcional se pondran a disposicin como una variable
en lugar de una constante. Implcitamente Unwrapped Opcionales Como
se describi anteriormente, opcionales indican que se permite una
variable constante o tener "ningn valor". Opcionales pueden ser
comprobadas con un caso de declaracin para ver si existe un valor,
y puede ser condicionalmente desenvolvi con opcional de unin para
acceder a el valor de la opcin, si es que existe. A veces se
desprende de la estructura de un programa que una opcin ser siempre
tener un valor, despus de que el valor se establece en primer
lugar. En estos casos, es til para eliminar la necesidad de
comprobar y desenvolver el valor de la opcional cada vez que se
accede, porque se puede suponer con seguridad a tener un valor todo
el tiempo. Este tipo de opcionales se definen como opcionales
implcitamente abierto . Usted escribe un implcitamente envolver
opcional colocando un signo de exclamacin ( cuerda! ) en lugar de
un signo de interrogacin (Cadena? ) despus de que el tipo que desea
que sea opcional. Implcitamente opcionales abierto son tiles cuando
el valor de un opcional se confirma que existe inmediatamente
despus de la opcional se define primero y definitivamente se puede
suponer que existe en cada punto a partir de entonces. El uso
principal de opcionales implcitamente abierto en Swift es durante
la inicializacin de clase, como se describe en las referencias sin
propietario e implcitamente Unwrapped propiedades opcionales . Un
opcional implcitamente envolver es una opcin normal de detrs de las
escenas, pero tambin se puede utilizar como un valor no opcional,
sin la necesidad de desenvolver el valor opcional cada vez que se
accede.El siguiente ejemplo muestra la diferencia de comportamiento
entre una cadena opcional y una cadena opcional implcitamente
desenvuelto al acceder a su valor envuelto como un explcito Cadena
:
let possibleString: String? = "An optional string." let
forcedString: String = possibleString! // requires an exclamation
mark let assumedString: String! = "An implicitly unwrapped optional
string." let implicitString: String = assumedString // no need for
an exclamation mark
Usted puede pensar en una forma implcita envolver opcional como
dar permiso para que el facultativo de desenvolverse de forma
automtica cada vez que se utiliza. En lugar de colocar un signo de
exclamacin despus del nombre de la opcin cada vez que lo use, se
coloca un signo de exclamacin despus de tipo de la opcin al
declararla. N O T A Si intenta acceder a una implcita envolver
opcional cuando no contiene un valor, se activar un error de
ejecucin. El resultado es exactamente el mismo que si se coloca un
signo de exclamacin despus de un opcional normal que no contenga un
valor. Todava se puede tratar una opcional implcitamente sin
envolver como un opcional normal, para comprobar si contiene un
valor:
if assumedString != nil { println(assumedString) }
-
34
// imprime "una cadena opcional implcitamente sin envolver."
Tambin puede utilizar una forma implcita envolver opcional con
opcional de unin, para comprobar y desenvolver su valor en una sola
sentencia:
if let definiteString = assumedString { println(definiteString)
}
// imprime "una cadena opcional implcitamente sin envolver." N O
T A No utilice un implcitamente sin envolver opcional cuando hay
una posibilidad de convertirse en una variablenula en un punto
posterior. Utilice siempre un tipo opcional normal si usted
necesita para comprobar si hay un nulo valor durante la vida de una
variable. Aseveraciones Opcionales te permite comprobar los valores
que pueden o no existir, y para escribir cdigo que hace frente con
gracia con la ausencia de un valor. En algunos casos, sin embargo,
simplemente no es posible que el cdigo para continuar la ejecucin
si el valor no existe, o si un valor proporcionado no cumple
ciertas condiciones. En estas situaciones, se puede desencadenar
una afirmacin en su cdigo para poner fin a la ejecucin de cdigo y
proporcionar una oportunidad para depurar la causa del valor
ausente o no vlido. Depuracin con afirmaciones Una afirmacin es un
cheque en tiempo de ejecucin que una condicin lgica definitivamente
se evala como verdadera . Literalmente palabras, una afirmacin
"afirma" que una condicin es verdadera. Utiliza una afirmacin para
asegurarse de que una condicin esencial se satisface antes de
ejecutar cualquier cdigo adicional. Si la condicin se evala como
verdadera , la ejecucin de cdigo contina como de costumbre; si la
condicin se evala como falsa , la ejecucin de cdigo termina, y su
aplicacin se termina. Si su cdigo desencadena una afirmacin
mientras se ejecuta en un entorno de depuracin, tales como cuando
se construye y ejecuta una aplicacin en Xcode, se puede ver
exactamente dnde se produjo el estado no vlido y consultar el
estado de su aplicacin en el momento en que la afirmacin fue
provocado.Una afirmacin tambin le permite proporcionar un mensaje
de depuracin adecuado en cuanto a la naturaleza de la asercin.
Usted escribe una afirmacin llamando al mundial afirman funcin. Se
pasa la asercin funcin de una expresin que se evala como verdadera
o falsa y un mensaje que se debe mostrar si el resultado de la
condicin es falsa :
let age = -3 assert(age >= 0, "A person's age cannot be less
than zero")
// Esto hace que la afirmacin para disparar, porque la edad no
es> = 0
-
35
En este ejemplo, la ejecucin de cdigo continuar slo si la
edad> = 0 se evala como verdadera , es decir, si el valor de la
edad es no negativo. Si el valor de la edad es negativo, como en el
cdigo anterior, a continuacin, la edad> = 0 se evala como falsa
, y la afirmacin se activa, de terminar la aplicacin. El mensaje
afirmacin puede omitirse si se desea, como en el siguiente
ejemplo:
afirmar ( edad > = 0 ) Cundo utilizar aserciones Utilice una
afirmacin cada vez que un estado tiene el potencial de ser falsa,
pero debe sin duda ser verdad para que su cdigo para continuar la
ejecucin. Escenarios adecuados para una comprobacin de asercin
incluyen: Un ndice subndice entero se pasa a una aplicacin subndice
de encargo, pero el
valor del ndice subndice podra ser demasiado baja o demasiado
alta. Un valor se pasa a una funcin, pero un valor no vlido
significa que la funcin no
puede cumplir su tarea. Un valor opcional es actualmente nula ,
sino un no- nil de valor es esencial para
el cdigo subsiguiente para ejecutar con xito. Ver tambin
subndices y Funciones . N O T A Las afirmaciones hacen que su
aplicacin para terminar y no son un sustituto para el diseo de su
cdigo de tal manera que las condiciones no vlidas es improbable que
surjan. No obstante, en situaciones donde las condiciones no vlidas
son posibles, una afirmacin es una forma eficaz de garantizar que
dichas condiciones se resaltan y se dieron cuenta durante el
desarrollo, antes de la publicacin de su aplicacin. A Swift tour
Operadores bsicos
-
36
Operadores bsicos En esta pgina Un operador es un smbolo
especial o una frase que se utiliza para comprobar, cambiar o
combinar los valores. Por ejemplo, el operador de suma ( + ) suma
dos nmeros juntos (como en let i = 1 + 2 ). Ejemplos ms complejos
incluyen el operador lgico AND && (como en el caso de
enteredDoorCode && passedRetinaScan) y el operador de
incremento ++ i , que es un acceso directo para aumentar el valor
de i por 1 . Swift es compatible con los operadores de C ms estndar
y mejora varias funciones para eliminar los errores comunes de
codificacin. El operador de asignacin ( = ) no devuelve un valor,
para evitar que sea utilizado por error cuando el operador igual a
( == ) se destina. Los operadores aritmticos ( + , - , * , / , % ,
etc) y no permiten detectar desbordamiento valor, para evitar
resultados inesperados cuando se trabaja con los nmeros que se
convierten en mayor o menor que el rango de valores permitido del
tipo que los almacena.Usted puede optar por el comportamiento de
desbordamiento de valor mediante el uso de operadores de
desbordamiento de Swift, como se describe en Operadores de
desbordamiento . A diferencia de C, Swift le permite realizar resto
( % ) clculos sobre nmeros de punto flotante. Swift tambin
proporciona dos operadores de rango ( un ..
-
37
Si el lado derecho de la asignacin es una tupla con mltiples
valores, sus elementos se pueden descomponer en varias constantes o
variables a la vez:
let (x, y) = (1, 2) // x is equal to 1, and y is equal to 2
A diferencia del operador de asignacin en C y Objective-C, el
operador de asignacin en Swift s mismo no devuelve ningn valor. La
siguiente declaracin no es vlida:
if x = y { // Esto no es vlido, ya que x = y no devuelve un
valor }
Esta funcin evita que el operador de asignacin ( = ) se utilice
por accidente cuando el operador igual a ( == ) se destina en
realidad. Al hacer si x = y no vlida, Swift le ayuda a evitar este
tipo de errores en el cdigo. Operadores aritmticos Swift es
compatible con los cuatro estndares operadores aritmticos para
todos los tipos de nmeros: Suma ( + ) Resta ( - ) Multiplicacin ( *
) Divisin ( / )
1 + 2 // equals 3 5 - 3 // equals 2 2 * 3 // equals 6 10.0 / 2.5
// equals 4.0
A diferencia de los operadores aritmticos en C y Objective-C,
los operadores aritmticos Swift no permiten valores se desborden
por defecto. Usted puede optar por el comportamiento de
desbordamiento de valor mediante el uso de operadores de
desbordamiento de Swift (como a & + b ). Ver Operadores de
desbordamiento . El operador de suma tambin es apoyado por Cadena
concatenacin:
"hello, " + "world" // equals "hello, world" Dos caracteres
valores, o uno de caracteres de valor y uno de cadena de valor, se
pueden sumar para hacer una nueva Cadena de valor:
let dog: Character = "" let cow: Character = "" let dogCow = dog
+ cow // dogCow is equal to ""
Ver tambin concatenar cadenas y caracteres . Operador resto El
operador de resto ( a% b ) resuelve cuntos mltiplos de b cabrn
dentro de una y devuelve el valor que queda (conocido como el resto
). N O T A
-
38
El operador resto ( % ) tambin se conoce como un operador de
mdulo en otros idiomas. Sin embargo, su comportamiento en Swift
para los nmeros negativos significa que es, estrictamente hablando,
un resto ms que una operacin de mdulo. He aqu cmo funciona el
operador resto. Para calcular el 9% 4 , primero calcular cuntos 4 s
se ajuste dentro de 9 :
Puede encajar dos 4 s interior 9 , y el resto es 1 (se muestra
en color naranja).
En Swift, esto se escribe como:
9 % 4 // equals 1
Para determinar la respuesta para a% b , el % del operador
calcula la siguiente ecuacin y devuelve restocomo salida:
un = ( b algunos multiplicador ) + resto
donde algunos multiplicador es el mayor nmero de mltiplos de b
que caben dentro de una . Insercin de 9 y 4 en esta ecuacin se
obtiene: 9 = ( 4 2 ) + 1 El mismo mtodo se aplica al calcular el
resto para un valor negativo de una :
- 9 % 4 // es igual a -1 Insercin de -9 y 4 en los rendimientos
ecuacin: -9 = ( 4 -2 ) + -1 dando un valor resto de -1 . El signo
de b es ignorado por los valores negativos de b . Esto significa
que a% b y un -b% siempre dan la misma respuesta. Clculos Resto en
coma flotante A diferencia del operador resto en C y Objective-C,
el operador resto de Swift tambin puede funcionar con nmeros de
punto flotante:
8 % 2,5 // es igual a 0,5 En este ejemplo, 8 dividido por 2,5 es
igual a 3 , con un resto de 0,5 , por lo que el operador devuelve
un restoDoble valor de 0,5 .
Los operadores de incremento y decremento Al igual que C, Swift
ofrece un operador de incremento ( ++ ) y un operador de decremento
( - ) como un acceso directo para aumentar o disminuir el valor de
una variable numrica por 1 . Puede utilizar estos operadores con
variables de cualquier nmero entero o tipo de punto flotante.
-
39
var i = 0 ++i // i now equals 1
Cada vez que se llama ++ i , el valor de i se incrementa en 1 .
Esencialmente, ++ i es un atajo para decir i = i + 1 Del mismo
modo,. --i se puede utilizar como forma abreviada de i = i - 1 . El
++ y - smbolos pueden ser utilizados como operadores de prefijo o
como operadores de sufijo. ++ i y i ++son dos formas vlidas para
aumentar el valor de i por 1 . Del mismo modo, --i y i-- son dos
formas vlidas para disminuir el valor de i por 1 . Tenga en cuenta
que estos operadores modifican i y tambin devuelven un valor. Si
slo desea aumentar o disminuir el valor almacenado en i , puede
ignorar el valor devuelto. Sin embargo, si usted no utiliza el
valor devuelto, que ser diferente en funcin de si ha utilizado la
versin prefijo o de sufijo del operador, de acuerdo con las
siguientes reglas: Si el operador est escrito antes de la variable,
se incrementa la variable antes
de devolver su valor. Si el operador est escrito despus de la
variable, se incrementa la variable despus
de regresar de su valor. Por ejemplo:
var a = 0 let b = ++a // a and b are now both equal to 1 let c =
a++
// A es igual a 2, pero c se ha establecido en el valor
pre-incremento de 1 En el ejemplo anterior, sea b = ++ un
incrementos de un antes de devolver su valor. Esta es la razn por
tantouna y b son iguales a al nuevo valor de 1 . Sin embargo, dej c
= a ++ incrementa un despus de regresar de su valor. Esto significa
que c recupera el antiguo valor de 1 , y un entonces se actualiza
para igualar 2 . A menos que necesite el comportamiento especfico
de i ++ , se recomienda que usted utilice ++ i y --i en todos los
casos, debido a que tienen el comportamiento esperado tpica de
modificar i y devolviendo el resultado. Operador menos unario El
signo de un valor numrico se puede activar mediante un prefijo - ,
conocido como el operador menos unario :
let three = 3 let minusThree = -three // minusThree equals -3
let plusThree = -minusThree // plusThree equals 3, or "minus minus
three"
El operador unario menos ( - ) se antepone directamente ante el
valor que opera en, sin ningn espacio en blanco.
-
40
Operador unario Plus El operador unario ms ( + ) simplemente
devuelve el valor que opera en, sin ningn cambio:
let minusSix = -6 let alsoMinusSix = +minusSix // alsoMinusSix
equals -6
Aunque el operador de suma unaria no hace nada, se puede
utilizar para proporcionar simetra en su cdigo para nmeros
positivos cuando tambin mediante el operador unario menos para los
nmeros negativos. Operadores de Asignacin Compuesto Al igual que C,
Swift proporciona operadores de asignacin compuestos que combinan
de asignacin ( = ) con otra operacin. Un ejemplo es el operador de
asignacin de suma ( + = ):
var a = 1 a += 2
// a es ahora igual a 3 La expresin a + = 2 es la abreviatura de
a = a + 2 . Efectivamente, la adicin y la asignacin se combinan en
un operador que realiza ambas tareas al mismo tiempo. N O T A Los
operadores de asignacin compuestos no devuelven un valor. No se
puede escribir al B = a + = 2 , por ejemplo. Este comportamiento es
diferente de los operadores de incremento y decremento mencionados
anteriormente. Una lista completa de operadores de asignacin
compuestos se puede encontrar en las expresiones . Operadores de
comparacin Swift es compatible con todos los C estndar operadores
de comparacin : Igual a ( a == b ) No es igual a ( a! = b ) Mayor
que ( a> b ) Menos de ( a = b ) Menor o igual a ( a 1 // cierto,
porque 2 es mayor que 1 1 < 2 // cierto, porque 1 es menor que 2
1 > = 1 // cierto, porque 1 es mayor que o igual a 1 2
-
41
Los operadores de comparacin se utilizan a menudo en las
sentencias condicionales, como el caso de la declaracin if:
let name = "world" if name == "world" { println("hello, world")
} else { println("I'm sorry \(name), but I don't recognize you")
}
// imprime "hola, mundo", porque el nombre es de hecho igual al
"mundo" Para ms informacin sobre el caso de la declaracin, vase el
control de flujo . Operador condicional ternario El operador
condicional ternario es un operador especial con tres partes, que
toma la forma pregunta?answer1: Respuesta2 . Es un acceso directo
para la evaluacin de una de las dos expresiones en funcin de
sipregunta es verdadera o falsa. Si pregunta es verdadera, evala
answer1 y devuelve su valor; de lo contrario, se evala Respuesta2 y
devuelve su valor. El operador condicional ternario es una
abreviacin para el cdigo de abajo:
if question { answer1 } else { answer2 }
He aqu un ejemplo, que calcula la altura de una fila de tabla.
La altura de la fila debe ser de 50 puntos ms alto que la altura
del contenido si la fila tiene una cabecera, y 20 puntos ms alto si
la fila no tiene un encabezado:
dejar que contentHeight = 40 dejar HasHeader = true dejar
rowHeight = contentHeight + ( HasHeader ? 50 : 20 ) // RowHeight es
igual a 90
El ejemplo anterior es una abreviatura para el cdigo de abajo:
let contentHeight = 40 let hasHeader = true var rowHeight =
contentHeight if hasHeader { rowHeight = rowHeight + 50 } else {
rowHeight = rowHeight + 20 }
-
42
// RowHeight es igual a 90 El primer uso del ejemplo del
operador condicional ternario significa que rowHeight se puede
establecer en el valor correcto en una sola lnea de cdigo. Esto es
ms conciso que el segundo ejemplo, y elimina la necesidad de
rowHeight a una variable, porque su valor no necesita ser
modificado dentro de un sideclaracin. El operador condicional
ternario proporciona una taquigrafa eficiente para decidir cul de
las dos expresiones a considerar. Utilice el operador condicional
ternario con cuidado, sin embargo. Su concisin puede conducir al
cdigo difcil de leer si se abusa. Evite combinar varias instancias
del operador condicional ternario en una sentencia compuesta.
Ninguna Coalescente Operador El operador de coalescencia nula ( a
?? b ) desenvuelve opcional un si contiene un valor, o devuelve un
valor predeterminado b si una es nula . La expresin una siempre es
de un tipo opcional. La expresin b debe coincidir con el tipo que
se almacena dentro de una . El operador de coalescencia nil es un
atajo para el cdigo de abajo:
a != nil ? a! : b El cdigo anterior utiliza el operador
condicional ternario y desenvolver forzada ( una! ) para acceder al
valor envuelto en una cuando una no es nula , ya regresar b lo
contrario. El operador de coalescencia nil ofrece una forma ms
elegante para encapsular esta comprobacin condicional y desenvolver
de una forma concisa y fcil de leer. N O T A Si el valor de una es
no nulo , el valor de b no se evala. Esto se conoce como evaluacin
de corto-circuito . El ejemplo siguiente utiliza el operador de
coalescencia nil que elegir entre un nombre de color por defecto y
un nombre de color definido por el usuario opcional:
let defaultColorName = "red" var userDefinedColorName: String?
// defaults to nil var colorNameToUse = userDefinedColorName ??
defaultColorName
// UserDefinedColorName es nula, por lo colorNameToUse se
establece en el valor predeterminado de "rojo" El
userDefinedColorName variable se define como un opcional de cuerda
, con un valor por defecto de cero .Debido userDefinedColorName es
de tipo opcional, puede utilizar el operador de coalescencia nil
considerar su valor. En el ejemplo anterior, el operador se utiliza
para determinar un valor inicial para una cadena variable llamada
colorNameToUse . Debido userDefinedColorName es nula , la expresin
userDefinedColorName ??defaultColorName devuelve el valor de
defaultColorName , o "rojo" .
-
43
Si asigna un no- nil valor a userDefinedColorName y ejecutar la
revisin operador coalescente nula de nuevo, el valor envuelto
dentro userDefinedColorName se utiliza en lugar del
predeterminado:
userDefinedColorName = "green" colorNameToUse =
userDefinedColorName ?? defaultColorName
// UserDefinedColorName no es nula, por lo colorNameToUse se
establece en "verde"
-
44
Operadores Range Swift incluye dos operadores de rango , que son
atajos para expresar un rango de valores. Cerrado operador Range El
operador de rango cerrado ( un ... b ) define un rango que va desde
una a b , e incluye los valores de una yb . El valor de un no debe
ser mayor que b . El operador de rango cerrado es til cuando se
repite en un intervalo en el que desea que todos los valores a
utilizar, por ejemplo, con un para - en bucle:
for index in 1...5 { println("\(index) times 5 is \(index * 5)")
} // 1 times 5 is 5 // 2 times 5 is 10 // 3 times 5 is 15 // 4
times 5 is 20 // 5 times 5 is 25
Para ms informacin sobre por - en bucles, consulte Flujo de
control . La mitad-Open Operator Range El operador entreabierta
gama ( un ..
-
45
Operadores lgicos Los operadores lgicos modificar o combinar los
valores lgicos booleanos true y false . Swift es compatible con los
tres operadores lgicos estndar que se encuentran en los idiomas
basados en C: Logical NOT (!a) Logical AND (a && b) Logical
OR (a || b)
Logical NOT Operator
El operador lgico NOT ( ! a) invierte un valor booleano para que
verdadera se convierte en falsa , y falsase convierte en verdadera
. El operador lgico NOT es un operador prefijo, y aparece
inmediatamente antes del valor que opera en, sin ningn espacio en
blanco. Se puede leer como "no una ", como se ve en el siguiente
ejemplo:
let allowedEntry = false if !allowedEntry { println("ACCESS
DENIED") } // prints "ACCESS DENIED"
La frase ! si allowedEntry se puede leer como "si no se permite
la entrada." La lnea posterior slo se ejecuta si "no entrada
permitida" es cierto; es decir, si allowedEntry es falsa . Como en
este ejemplo, la eleccin cuidadosa de nombres de constantes y
variables booleanas puede ayudar a mantener el cdigo legible y
conciso, evitando dobles negaciones o afirmaciones lgicas confusas.
Y lgico Operador El operador lgico Y ( a && b ) crea
expresiones lgicas donde ambos valores deben ser verdad para la
expresin general que tambin sea cierto . Si alguno de los valores
es falso , la expresin general tambin ser falsa . De hecho, si el
primer valor esfalso , el segundo valor de ni siquiera ser
evaluada, ya que no puede hacer la expresin global equivale a
laverdad . Esto se conoce como evaluacin de corto-circuito . En
este ejemplo se considera dos Bool valores y slo permite el acceso
si ambos valores son true :
let enteredDoorCode = true let passedRetinaScan = false if
enteredDoorCode && passedRetinaScan { println("Welcome!") }
else { println("ACCESS DENIED") }
-
46
// prints "ACCESS DENIED"
Operador lgico OR El operador lgico OR ( a || b ) es un operador
infijo hecho a partir de dos personajes de tuberas adyacentes. Se
utiliza para crear expresiones lgicas en las que slo uno de los dos
valores tiene que serverdadera para la expresin general para ser
verdad . Al igual que el operador lgico AND anterior, el operador
lgico OR utiliza la evaluacin de cortocircuito para considerar sus
expresiones. Si el lado izquierdo de una expresin lgica OR es
verdadera , no se evala el lado derecho, porque no puede cambiar el
resultado de la expresin general. En el siguiente ejemplo, la
primera Bool valor ( hasDoorKey ) es falsa , pero el segundo valor
(knowsOverridePassword ) es verdadera . Debido a que un valor es
verdadero , la expresin general tambin se evala como verdadera , y
se permite el acceso:
let hasDoorKey = false let knowsOverridePassword = true if
hasDoorKey || knowsOverridePassword { println("Welcome!") } else {
println("ACCESS DENIED") } // prints "Welcome!"
La combinacin de operadores lgicos Puede combinar mltiples
operadores lgicos para crear expresiones compuestas ms largos:
if enteredDoorCode && passedRetinaScan || hasDoorKey ||
knowsOverridePassword { println("Welcome!") } else {
println("ACCESS DENIED") } // prints "Welcome!"
Este ejemplo utiliza mltiples && y || operadores para
crear una expresin compuesta por ms tiempo. Sin embargo, el
&& y || operadores siguen funcionando en slo dos valores,
por lo que este es en realidad tres expresiones ms pequeas
encadena