Grande bomba :P Bem, talvez seja eu que compare o modo anterior com o novo. A evolução não tem comparação !
2014-09-04 18:31 GMT+01:00 APintex Gmail <[email protected]>: > :) Hugo, o meu MB Pro tem 16Gb e SSD 500Gb... > tenho sempre montes de app abertas (XAMPP, FB, MySQLWorkbench, vários > Sublime text com PHP, Dash, Mail, Safari com n pág abertas, para não falar > em skypes e companhia). Dá para tudo e nunca se queixou eheheh... > > António Pinto > [email protected] > > > > No dia 04/09/2014, às 18:26, Hugo Ferreira <[email protected]> > escreveu: > > APintex, > > Conheco perfeitamente o sintoma à alguns anos. Também existe um problema > que começa a dar um erro no FB (reportado por mim à muito tempo e com > muitos requests e também sem correcção). O workaround é fechar e voltar a > abrir ! > > Posso te dizer que antes com 4 GB ram e disco normal, demorava vários > segundos a arrancar o OS, muitos segundos a abrir o FB e era impensável ter > uma outra app aberta que consumi-se mais do que alguns dezenas de MB de RAM. > > Agora com 8 GB ram + disco SSD, demora 2 segundos a ter o OS totalmente > pronto, o FB deve demorar uns 3-4 segundos a estar operacional e é possível > ter outro programa aberto (Eclipse, VirtualBox com 2 GB ram dedicado !). > > Não sei se foi apenas da ram, disco ou tudo junto mas fica a nota. > > > > > > 2014-09-04 18:22 GMT+01:00 Apintex <[email protected]>: > >> Hugo, a razão pela qual quero sair do FB é por ficar demasiado lento e >> consumir recursos passados 20min e se abrir um segundo projecto. >> >> Att, >> >> António Pinto >> >> No dia 04/09/2014, às 17:28, Hugo Ferreira <[email protected]> >> escreveu: >> >> APintex, >> >> Ainda não tinha pensado nisso mas é bem verdade. >> >> Eu mudei para o OS X à 2 anos e digo-te é sem V de volta. Todos os >> portáteis baratos ou caros que passam pelas minhas mãos não chegam ao fim >> da garantia e este é impecável. Nada a apontar. De tal forma que após >> acabar a garantia, investi para duplicar a RAM e troquei o disco por um SSD >> e com garantia da Apple. Digo-te que valeu cada cêntimo principalmente para >> o FB que abusa da máquina. >> >> Por um lado gostaria de saír do FB. É um IDE preso no tempo :( mas por >> outro lado serve o seu propósito e pelo que sondei, os outros não estão à >> altura. >> >> Eu uso o MySQL em paralelo com o SQL Server à uns anos. Ao fim de algum >> tempo de conheceres bem os motores, consegues fazer SQL quase 100% >> compatível sem um ORM (principalmente se usares SQL Server 2012+). >> >> Todos os projectos que faço, faço logo compatíveis com esses 2 motores. >> >> Para reports (que nenhum dev gosta) para AIR recomendo o único que >> conheço: Stimulsoft mas é client-side. Podes usar uma app AIR via linha de >> comandos no servidor para gerar reports como workaround se precisares de >> reports no lado do servidor com PHP. >> Têm um solução ASP.NET <http://asp.net/> para quem usar este backend sem >> workarounds. >> >> Já disse no forum que se fizeram um solução HTML5 (puro) estou disposto a >> pagar em avanço. Dizem que é algo que andam a pensar :) >> >> >> 2014-09-04 17:17 GMT+01:00 APintex Gmail <[email protected]>: >> >>> 2014 foi e está a ser um ano de mudanças... >>> Passei do Windows para o OS X, quero passar do Flash Builder para o >>> IntelliJ IDEA (ainda não tive coragem) >>> Estou a refazer um projecto de .Net para AIR, de MSSQL para MySQL e >>> webservices feitos em .Net para PHP. >>> No meio disto tudo o que mais me custa são os reports (uma seca para mim >>> desde sempre) >>> >>> António Pinto >>> [email protected] >>> >>> >>> >>> No dia 04/09/2014, às 16:58, Hugo Ferreira <[email protected]> >>> escreveu: >>> >>> É como eu. Na realidade acredito que a maioria esteja no mesmo barco. >>> Para coisas a sério ainda não. >>> Quem já trabalha à anos com Objective-C, irá continuar mesmo após o >>> Swift se tornar uma realidade viável. >>> >>> Terminei o meu primeiro projecto HTML5 e correu muito bem. No final >>> demorei muito menos tempo do que previa e já tenho agora uma base para >>> fazer o próximo mais rapidamente. >>> >>> Quando houver tempo irei recriar um projecto em Flex com HTML5 e mais >>> tarde outro (se isto algum dia vier a acontecer) e depois disso acho que >>> não voltarei a usar o Flash ! >>> >>> O AIR vou continuar a usar e abusar e também muito código nativo com >>> Android. >>> >>> Também acho que o Swift será uma realidade para mim só para o ano que >>> vem ! >>> >>> >>> 2014-09-04 16:48 GMT+01:00 Apintex <[email protected]>: >>> >>>> Hugo, para já é pura curiosidade no Swift. Instalei o Xcode 6 beta e >>>> nem o abri. :( >>>> Vou vendo alguns exemplos para ir aprendendo alguma coisa e partilho >>>> com vocês os que acho importantes. >>>> Estou a terminar um projecto (MoneyEX Pro) e só no início do próximo >>>> ano começarei a trabalhar com o Swift. >>>> >>>> Att, >>>> >>>> António Pinto >>>> >>>> No dia 04/09/2014, às 16:10, Hugo Ferreira <[email protected]> >>>> escreveu: >>>> >>>> APintex, >>>> >>>> Acabei à pouco tempo de ler 2 bons livros de desenvolvimento Android. >>>> Já desenvolvi diversas ANE's para Android e já me sinto suficientemente >>>> confortável para desenvolver qualquer app para Android ou mesmo ANE. >>>> >>>> Em breve gostaria de entrar no desenvolvimento nativo para iOS (tanto >>>> apps como ANE's) e aqui ficam algumas dúvidas: >>>> 1. Não faz sentido nesta altura do campeonato investigar em Objective-C >>>> (thank you god); >>>> 2. Será que não vale a pena esperar por um bom livro que seja uma >>>> compilação do desenvolvimento Swift (de preferência em PT). Ainda não vi >>>> nenhum na Fnac; >>>> 3. Será que irá ser possível desenvolver ANE's com swift. Penso que >>>> aqui a única coisa que falta é a lib que actualmente é para Objective-C >>>> (para alguém transcrever tem de saber bem Objective-C) ou será possível >>>> usar a actual ? >>>> >>>> As minhas expectativas são: >>>> - Dentro de 1 ano o iOS8 tenha mais de 80% de market share para valer a >>>> pena; >>>> - Existam bons livros e exemplos; >>>> - Exista um lib para Swift (a Adobe tem de fazer) ou ser possível usar >>>> a actual (não sei); >>>> - Exista uma framework para Bluetooth LE (para mim é importante) tal >>>> como já existe com Objective-C ou se possa usar as actuais. >>>> >>>> >>>> >>>> 2014-09-04 15:58 GMT+01:00 APintex Gmail <[email protected]>: >>>> >>>>> >>>>> António Pinto >>>>> [email protected] >>>>> >>>>> >>>>> >>>>> http://realm.io/news/swift-enums-pattern-matching-generics/ >>>>> >>>>> Sign up to be notified of future videos >>>>> >>>>> We won't email you for any other reason, ever. >>>>> ------------------------------ >>>>> Enums (0:40) >>>>> >>>>> Enums are a kind of abstraction that allow you to give a variable one >>>>> value among several related values. For example, when building a state >>>>> machine you could have an enum that describes the state of an object from >>>>> a >>>>> set number of states. There are three types of enums in Swift. >>>>> Basic Enum (1:12) >>>>> >>>>> The most basic Swift enum simply has a bunch of cases and is declared >>>>> using the enum key word. In this example, the enum is called Direction and >>>>> can only be one of the four provided cases. To declare an enum, you use >>>>> the >>>>> enum name, followed by a dot and then one of the possible values. Unlike >>>>> in >>>>> Objective-C or C, enums are not typedefs of aliases for integers. >>>>> >>>>> enum Direction { >>>>> case North >>>>> case South >>>>> case East >>>>> case West } >>>>> let myDirection = Direction.North >>>>> >>>>> Raw Value Enum (2:00) >>>>> >>>>> The second type of Swift enum is a "raw value" enum, which is the same >>>>> as the basic enum but has additional raw values associated with each case. >>>>> In this enum Title, each case has an associated string that is the name >>>>> for >>>>> the title. Important to note is that the raw value and the enum itself are >>>>> not interchangeable. The toRaw and fromRaw methods help to go between the >>>>> value and the enum. >>>>> >>>>> enum Title : String { >>>>> case CEO = "Chief Executive Officer" >>>>> case CTO = "Chief Technical Officer" >>>>> case CFO = "Chief Financial Officer"} >>>>> let myTitle = Title.CEO let myString : String = Title.CEO.toRaw() let >>>>> anotherTitle : Title = >>>>> Title.fromRaw("Chief Executive Officer")! >>>>> >>>>> For integer type raw enums, integer numbering remains implicit if you >>>>> do not specify values. Swift automatically counts up from the last >>>>> provided >>>>> explicit value. This can be seen in the following example: >>>>> >>>>> enum Planet : Int { >>>>> case Mercury = 1 >>>>> case Venus, Earth, Mars // 2, 3, 4 >>>>> case Jupiter = 100 >>>>> case Saturn, Uranus, Neptune // 101, 102, 103 } >>>>> >>>>> Associated Value Enum (3:52) >>>>> >>>>> The third type of enum is one with associated values. Each case in the >>>>> enum can carry associated data. In this example from the Swift book, the >>>>> bar code enum allows you to associate different QR codes with different >>>>> strings. >>>>> >>>>> enum Barcode { >>>>> case UPCA(sys: Int, data: Int, check: Int) >>>>> case QRCode(String) } >>>>> let myUPC = >>>>> Barcode.UPCA(sys: 0, data: 27917_01919, check: 2) let myQRCode = >>>>> Barcode.QRCode("http://example.com") >>>>> >>>>> Associated values are especially useful in handling JSON, because >>>>> arrays and dictionaries are actually types. Thus, you can create an enum >>>>> to >>>>> represent a JSON structure as a tree, with JSON nodes wrapping different >>>>> types. >>>>> >>>>> enum JSONNode { >>>>> case NullNode >>>>> case StringNode(String) >>>>> case NumberNode(Float) >>>>> case BoolNode(Bool) >>>>> case ArrayNode([JSONNode]) >>>>> case ObjectNode([String:JSONNode]) } >>>>> let x : JSONNode = .ArrayNode( >>>>> [.NumberNode(10.0), >>>>> .StringNode("hello"), >>>>> .BoolNode(false)]) >>>>> >>>>> Switch Statements (Pattern Matching) (6:17) >>>>> >>>>> Switch statements is where most of the pattern matching functionality >>>>> in Swift comes from. A basic switch statement looks very similar to an >>>>> Objective-C switch statement, where there is a clause followed by cases. >>>>> Two things to note: Swift switches don't have breaks, so for old style >>>>> fallthrough behaviour, your code must have an explicit use of the keyword >>>>> fallthrough. Switch statements must also be comprehensive, so default >>>>> cases >>>>> are required, which may help prevent errors. >>>>> >>>>> let value = 10switch value { case 10: println("ten") case 20: >>>>> println("twenty") case 30: println("thirty") default: println("another >>>>> number") } >>>>> >>>>> Ranges (8:35) >>>>> >>>>> In Swift, you can also pattern match on anything that's comparable. >>>>> You can even match strings now to a case (and printout emojis for a fun >>>>> parlor trick!). Anything that can be compared with the double equals >>>>> operator can be matched. Swift also allows matching on ranges, where >>>>> ranges >>>>> can be the pattern inside a switch state. >>>>> >>>>> let v: UInt = 10switch v { case 0...9: println("Single digit") case >>>>> 10...99: println("Double digits") case 100...999: println("Triple >>>>> digits") default: println("4 or more digits") } >>>>> >>>>> Tuples (9:00) >>>>> >>>>> Tuples are composite data types - they contain multiple elements that >>>>> can all be of different types. A tuple is then represented by the types of >>>>> its elements. In this tuple-based switch statement, a tuple is the input. >>>>> Each element in the pattern tuple is actually a sub-pattern, so you can >>>>> match against patterns in each element. The underscore represents a "I >>>>> don't care" value. In this example, the last case functions as a default >>>>> because the (_, _) says the same thing as a default - none of the other >>>>> cases match, and we don't care about other possible values. >>>>> >>>>> let person = ("Helen", 25) switch person { case ("Helen", let age): >>>>> println("Your name is Helen, and you are \(age)" + " years old") case >>>>> (_, 13...19): >>>>> println("You are a teenager") case ("Bob", _): >>>>> println("You are not a teenager, but your name" + " is Bob.") case (_, >>>>> _): >>>>> println("no comment") } >>>>> >>>>> Binding in Cases (10:56) >>>>> >>>>> If you have case statements, there may be associated data that needs >>>>> to be used in the case statement body. The let binding is how you can do >>>>> that. The first two cases in this example take the tuple elements and >>>>> create the bindings X and Y to represent those elements. >>>>> >>>>> let myTuple = ("abcd", 1234) switch myTuple { case let (x, y): >>>>> "The string in 'x' is \(x); " + "the integer in 'y' is \(y)"case (let >>>>> x, let y): >>>>> "Another way to do the exact same thing"case (_, let y): >>>>> "We don't care about the string in 'x', " + "but the integer in 'y' is >>>>> \(y)"} >>>>> >>>>> Enums (12:22) >>>>> >>>>> You can also switch on enums, but for enums with values wrapped >>>>> inside, switch statements are the only way you can access those values. >>>>> The >>>>> following switch statement uses let to bind each case and use the value. >>>>> >>>>> enum ParseResult { >>>>> case NumericValue(Int) >>>>> case Error(String) } >>>>> let a = ParseResult.NumericValue(1) switch a { case let .NumericValue(v): >>>>> "Success; numeric value is \(v)"case .Error(let err): >>>>> "Failed; error message is \(err)"} >>>>> >>>>> Types (13:20) >>>>> >>>>> The main type of switch is the type/sub-class pattern. If your switch >>>>> conditional in this clause is a class, then class will have sub- or >>>>> superclasses. In this example, the UIView is matched against the different >>>>> possible types of views: UIImageView, UILabel, and UITableView. The "as" >>>>> keyword differs from the "is" keyword in that "as" allows you to use the >>>>> let binding and do something with myView, while "is" is used simply to >>>>> check the type. >>>>> >>>>> let myView : UIView = getView() switch myView { case is UIImageView: >>>>> println("It's an image view")case let lbl as UILabel: >>>>> println("It's a label, with text \(lbl.text)") case let tv as >>>>> UITableView: >>>>> println("It's a table view, with"+ " \(tv.numberOfSections()) >>>>> sections") default: >>>>> println("It's some other type of view") } >>>>> >>>>> where clause (14:33) >>>>> >>>>> Another important thing about switch statements is the where cause. >>>>> This clause can be added to any case and acts as a boolean expression that >>>>> returns true or false. The case is then taken only if this where clause >>>>> returns true. This switch example relies not on pattern matching but >>>>> instead on these where clauses, following through with the case if myView >>>>> is of a certain size or other characteristic. >>>>> >>>>> let myView : UIView = getView() switch myView { case _ where >>>>> myView.frame.size.height < 50: >>>>> println("Your view is shorter than 50 units") case _ where >>>>> myView.frame.size.width > 20: >>>>> println("Your view is at least 50 units tall," + " and is more than 20 >>>>> units wide") case _ where >>>>> myView.backgroundColor == UIColor.greenColor(): >>>>> println("Your view is at least 50 units tall," + " at most 20 units >>>>> wide, and is green.") default: >>>>> println("I can't describe your view.") } >>>>> >>>>> Expression Operator (15:28) >>>>> >>>>> A final important feature in Swift is the expression operator. >>>>> >>>>> func ~=(pattern: Type1, value: Type2) -> Bool >>>>> >>>>> This operator takes the pattern and the value, and then uses pattern >>>>> matching to return true or false. It can be overloaded as well to >>>>> implement >>>>> custom matching behaviour. The following piece of code is Swift >>>>> pseudo-code >>>>> to demonstrate what you could build. In an array four elements long, you >>>>> could create cases that matched any combination of the elements. >>>>> >>>>> let myArray = [1, 2, 4, 3]switch myArray { case [..., 0, 0, 0]: >>>>> doSomething()case [4, ...]: >>>>> doSomething() case [_, 2, _, 4]: >>>>> doSomething() case [_, _, 3, _]: >>>>> doSomething() case [_, _, _, 3]: >>>>> doSomething() default: >>>>> doDefault() } >>>>> >>>>> Expression Patterns (17:42) >>>>> >>>>> The following extended example is a custom implementation of the >>>>> pattern match operator. This custom operator turns the elements of an >>>>> array >>>>> into the enum values. >>>>> >>>>> enum WCEnum { >>>>> case Wildcard >>>>> case FromBeginning >>>>> case ToEnd >>>>> case Literal(Int) } >>>>> func ~=(pattern: [WCEnum], value: [Int]) -> Bool { >>>>> var ctr = 0 >>>>> for currentPattern in pattern { >>>>> if ctr >= value.count || ctr < 0 { return false } >>>>> let currentValue = value[ctr] >>>>> switch currentPattern { >>>>> case .Wildcard: ctr++ >>>>> case .FromBeginning where ctr == 0: >>>>> ctr = (value.count - pattern.count + 1) >>>>> case .FromBeginning: return false >>>>> case .ToEnd: return true >>>>> case .Literal(let v): >>>>> if v != currentValue { return false } >>>>> else { ctr++ } >>>>> } >>>>> } >>>>> return true} >>>>> >>>>> Protocols (21:06) >>>>> >>>>> In order to understand generics, you have to understand protocols, >>>>> which are something that existed in Objective-C as well. Protocols are >>>>> basically a contract that can define nothing at all or any number of >>>>> methods and properties. However, protocols can't have any implementation >>>>> details - they can only have method signatures and property names. >>>>> MyProtocol in this code defines just one property as requiring a getter >>>>> and >>>>> setter, as well as one method. >>>>> >>>>> protocol MyProtocol { >>>>> var someProperty : Int { get set } >>>>> func barFunc (x: Int, y: Int) -> String} >>>>> >>>>> Types can conform to none, one, or multiple protocols. Protocols can >>>>> also inherit from other protocols, thereby getting all the parent >>>>> protocol's methods and properties. >>>>> Conformance (23:18) >>>>> >>>>> With protocols, you can make classes, structs, and enums conform to >>>>> them. By making a type conform to a protocol, you are telling the compiler >>>>> that your type will match the definitions set in the protocol. MyClass >>>>> conforms to MyProtocol in providing implementations that match. >>>>> >>>>> class MyClass { >>>>> // Nothing here... >>>>> // This won't compile!} >>>>> class MyClass : MyProtocol { >>>>> var myProperty : Int = 0 >>>>> // Property conformance >>>>> func barFunc (x: Int, y: Int) -> String { >>>>> return "\(x) + \(y) = \(x + y)" >>>>> } >>>>> var someProperty : Int { >>>>> get { >>>>> return myProperty >>>>> } >>>>> set { >>>>> myProperty = newValue >>>>> } >>>>> } } >>>>> >>>>> Uses (24:06) >>>>> >>>>> There are a few reasons you may want to use protocols. The first >>>>> reason is parent-child relationships, where you don't want all the >>>>> children >>>>> to have a specific class of a parent. For example, UITableView comes with >>>>> Cocoa and is a list of objects that specifies the number and content of >>>>> cells. For the delegate to provide that information, it just has to >>>>> implement the protocol which has methods for the cells. This way, you can >>>>> avoid specifying the delegate as a sub-class of a class. >>>>> >>>>> A second major use for protocols can be seen in the Swift Standard >>>>> Library, where they add functionality to a type, piece by piece. >>>>> Equatable, >>>>> LogicValue, and AbsoluteValuable are all protocols that are implemented by >>>>> different types in the library. The LogicValue protocol has a method that >>>>> takes an object and turns it into true or false, so if you create a custom >>>>> type and implement this protocol, you can use that type in an if >>>>> statement's clause. >>>>> >>>>> One final use for protocols is to allow different types to be >>>>> described by the same generic type parameter. For example, if you wanted >>>>> to >>>>> put different types into an array, you could give the objects a protocol >>>>> and then declare the array with the protocol. You then have an array of >>>>> equatables and anything that conforms to the equatable in that array can >>>>> be >>>>> added. >>>>> >>>>> protocol JSONType { } extension String : JSONType { } extension Float : >>>>> JSONType { } extension Bool : JSONType { } extension Array : JSONType { } >>>>> extension Dictionary : JSONType { } >>>>> let b : Array<JSONType> = [10.1, 10.2, "foo"] let a : Array<JSONType> = >>>>> [10.0, "bar", false, b] >>>>> >>>>> Generics (28:36) >>>>> >>>>> Generics did not exist in Objective-C. THey are basically the >>>>> statically typed languages' answer to the flexibility of dynamically typed >>>>> languages. Generics are used to allow you to use the same code for >>>>> different types. The type parameter allows you to do this >>>>> generically. >>>>> >>>>> func swapItems<T>(inout this: T, inout that: T) { >>>>> let tempThis = this >>>>> this = that >>>>> that = tempThis } >>>>> >>>>> With generics, you can also enforce more constraints, as in the >>>>> following example. The ": Equatable" allows you to constrain T to any type >>>>> that conforms to Equatable, or is valid with the double equals operator. >>>>> >>>>> func firstAndLastAreEqual<T : Equatable> >>>>> (someArray: Array<T>) -> Bool { >>>>> let first = someArray[0] >>>>> let last = someArray[someArray.count - 1] >>>>> return first == last } >>>>> >>>>> You can also use generics for either functions or type declarations. >>>>> Type information is available at runtime, which is helpful. The compiler >>>>> can optimize by creating specific versions for each type that's being used >>>>> (like C++ templates), but it can also fall back to the generic >>>>> implementation. >>>>> Extended Example (33:56) >>>>> >>>>> In the extended example, the goal was to create a function that was >>>>> typesafe and could handle every case that involved the following types: >>>>> Array, Dictionary, SquareMatrix, TreeNode. The function was to take a >>>>> collection of one of the above types, take an array, and append the items >>>>> in that collection to the array. >>>>> >>>>> A protocol was defined to specify that a type can give back all of the >>>>> elements inside of it. You have containers that can implement >>>>> "AllElements". On a generic level, you might need to know the type of the >>>>> elements inside the collection, and so a wildcard is called "ElementType". >>>>> And so, you specify the element type when you implement the function >>>>> itself. >>>>> >>>>> protocol AllElements { >>>>> typealias ElementType >>>>> // Return an array containing all the objects >>>>> // in the collection >>>>> func allElements() -> Array<ElementType> } >>>>> >>>>> Another thing you can use is the NilLiteral protocol, the point of >>>>> which is to take nil and turn it into something equivalent to nil in that >>>>> type. For an int, it would return 0, or maybe for a string, it would >>>>> return >>>>> "". In the following example, you would want it to return something of >>>>> type >>>>> self. >>>>> >>>>> protocol NilLiteralConvertible { >>>>> class func convertFromNilLiteral() -> Self} >>>>> >>>>> Extensions then add methods, computed properties, and protocol >>>>> conformance to existing types. Array and SquareMatrix are both fairly >>>>> straightforward - you just return the arrays themselves. For the >>>>> Dictionary, you iterate through all the elements, create a buffer, and >>>>> return it with the elements inside. Finally, for the tree, you go through >>>>> the tree in a recursive traversal and again add the elements to a buffer. >>>>> >>>>> Put together, the final function appendToArray calls AllElements and >>>>> gives "a", which is an array with all the elements on the source. Then >>>>> each >>>>> of those elements is just added to the array in "dest". This works because >>>>> the generic argument "T" has to implement AllElements, and U has been >>>>> constrained to the same type as T. The where clause is included in case >>>>> you >>>>> want to do more than have this type implement one protocol. Before the >>>>> where, you declare type arguments, which can conform to either one or none >>>>> protocols. If you want T to conform to 2+ protocols, add a "where" clause >>>>> to constrain. You can then constrain any free type arguments you declared >>>>> earlier and any associated types associated with the type arguments via >>>>> protocols (e.g. T.SomeType). >>>>> >>>>> func appendToArray >>>>> <T: AllElements, U where U == T.ElementType> >>>>> (source: T, inout dest: Array<U>) { >>>>> >>>>> let a = source.allElements() >>>>> for element in a { >>>>> dest.append(element) >>>>> } } >>>>> var buffer = ["a", "b", "c"] appendToArray([1: "foo", 2: "bar"], &buffer) >>>>> >>>>> Now you've created five methods for this one process. In actuality, >>>>> you would have your containers implement Sequence and use a for-in loop to >>>>> go through all the elements. This requires knowledge of Generators, >>>>> EnumerateGenerators, and other material. >>>>> Q&A (46:05) >>>>> >>>>> *Q: In the extension example, are we extending all arrays of anything?* >>>>> Austin: Yes, which is why this is a bad idea in practice. You can't >>>>> actually say that you only want arrays with JSON type objects to also >>>>> implement JSON array, which is needed to ensure that you have valid JSON. >>>>> >>>>> *Q: Is the type T built-in? Where does it come from?* >>>>> Austin: T is actually coming from the declaration of array. If you >>>>> command-click an array in XCode, the declaration of the array shows that >>>>> it >>>>> declares a generic argument T that has some constraints. >>>>> >>>>> *Q: Is there any kind of trace for generics and the way it works? Is >>>>> it traceable to an existing language or is it brand-new?* >>>>> Austin: I don't know the answer, but I'm sure there are precedents. >>>>> Generics in Swift kind of de-emphasize object oriented programming because >>>>> they're built more around protocols than around class hierarchies. You >>>>> might get a closer procedent if you looked at Haskell. >>>>> >>>>> *Q: What is the exclamation point used for?* >>>>> Austin: The exclamation mark is for optionals. Everything in Swift is >>>>> non-nilable by default, so if you want to set something to nil, it must be >>>>> declared as an optional. The question mark after the type signifies this. >>>>> Then, the exclamation mark, or bang, takes the value out of the optional >>>>> so >>>>> you can use it. >>>>> >>>>> *Q: Is there something like value template parameters in Swift? Or >>>>> should we just type in, type template?* >>>>> Austin: I don't think so, I don't think Swift generics are as >>>>> powerful. >>>>> >>>>> *Q: Can you explain let? It seemed like it would sometimes check the >>>>> case and othertimes it would set it to the constant.* >>>>> Austin: A let pattern kind of matches everything, but also takes a >>>>> value and puts it in the constant for later use. When we use "as", it both >>>>> checks the type and also puts it in the constant. >>>>> ------------------------------ >>>>> Sign up to be notified of future videos >>>>> >>>>> We won't email you for any other reason, ever. >>>>> >>>>> >>>>> -- >>>>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>>> do Grupos do Google. >>>>> Para anular a subscrição deste grupo e parar de receber emails do >>>>> mesmo, envie um email para [email protected]. >>>>> Para publicar uma mensagem neste grupo, envie um email para >>>>> [email protected]. >>>>> Visite este grupo em http://groups.google.com/group/riapt. >>>>> Para mais opções, visite https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> -- >>>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>> do Grupos do Google. >>>> Para anular a subscrição deste grupo e parar de receber emails do >>>> mesmo, envie um email para [email protected]. >>>> Para publicar uma mensagem neste grupo, envie um email para >>>> [email protected]. >>>> Visite este grupo em http://groups.google.com/group/riapt. >>>> Para mais opções, visite https://groups.google.com/d/optout. >>>> >>>> >>>> -- >>>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>> do Grupos do Google. >>>> Para anular a subscrição deste grupo e parar de receber emails do >>>> mesmo, envie um email para [email protected]. >>>> Para publicar uma mensagem neste grupo, envie um email para >>>> [email protected]. >>>> Visite este grupo em http://groups.google.com/group/riapt. >>>> Para mais opções, visite https://groups.google.com/d/optout. >>>> >>> >>> >>> -- >>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >>> Grupos do Google. >>> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >>> envie um email para [email protected]. >>> Para publicar uma mensagem neste grupo, envie um email para >>> [email protected]. >>> Visite este grupo em http://groups.google.com/group/riapt. >>> Para mais opções, visite https://groups.google.com/d/optout. >>> >>> >>> >>> -- >>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >>> Grupos do Google. >>> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >>> envie um email para [email protected]. >>> Para publicar uma mensagem neste grupo, envie um email para >>> [email protected]. >>> Visite este grupo em http://groups.google.com/group/riapt. >>> Para mais opções, visite https://groups.google.com/d/optout. >>> >> >> >> -- >> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >> Grupos do Google. >> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >> envie um email para [email protected]. >> Para publicar uma mensagem neste grupo, envie um email para >> [email protected]. >> Visite este grupo em http://groups.google.com/group/riapt. >> Para mais opções, visite https://groups.google.com/d/optout. >> >> >> -- >> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >> Grupos do Google. >> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >> envie um email para [email protected]. >> Para publicar uma mensagem neste grupo, envie um email para >> [email protected]. >> Visite este grupo em http://groups.google.com/group/riapt. >> Para mais opções, visite https://groups.google.com/d/optout. >> > > > -- > Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da > Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do > Grupos do Google. > Para anular a subscrição deste grupo e parar de receber emails do mesmo, > envie um email para [email protected]. > Para publicar uma mensagem neste grupo, envie um email para > [email protected]. > Visite este grupo em http://groups.google.com/group/riapt. > Para mais opções, visite https://groups.google.com/d/optout. > > > -- > Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da > Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do > Grupos do Google. > Para anular a subscrição deste grupo e parar de receber emails do mesmo, > envie um email para [email protected]. > Para publicar uma mensagem neste grupo, envie um email para > [email protected]. > Visite este grupo em http://groups.google.com/group/riapt. > Para mais opções, visite https://groups.google.com/d/optout. > -- Recebeu esta mensagem porque está inscrito no grupo "Mailing List da Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" dos Grupos do Google. Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para [email protected]. Para publicar uma mensagem neste grupo, envie um e-mail para [email protected]. Visite este grupo em http://groups.google.com/group/riapt. Para mais opções, consulte https://groups.google.com/d/optout.
