swift 资料
swift 开源代码学习
https://github.com/belm/BaiduFM-Swift
http://www.cnblogs.com/zzc19920809/p/4881268.html
https://github.com/CocoaChina-editors/Welcome-to-Swift
APIController.swift
import Foundation protocol APIControllerProtocol { func didReceiveAPIResults(results: NSArray) } class APIController { var delegate: APIControllerProtocol init(delegate: APIControllerProtocol) { self.delegate = delegate } func get(path: String) { let url = NSURL(string: path) let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in print("Task completed") if(error != nil) { // If there is an error in the web request, print it to the console print(error!.localizedDescription) return } do{ let json: AnyObject? = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) let jsonResult = json as? NSDictionary if jsonResult != nil { if let results: NSArray = jsonResult?["results"] as? NSArray { self.delegate.didReceiveAPIResults(results) } } } catch{ } }) // The task is just an object with all these properties set // In order to actually make the web request, we need to "resume" task.resume() } func searchItunesFor(searchTerm: String) { // The iTunes API wants multiple terms separated by + symbols, so replace spaces with + signs let itunesSearchTerm = searchTerm.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil) // Now escape anything else that isn't URL-friendly if let escapedSearchTerm = itunesSearchTerm.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) { let urlPath = "https://itunes.apple.com/search?term=\(escapedSearchTerm)&media=music&entity=album" get(urlPath) } } func lookupAlbum(collectionId: Int) { get("https://itunes.apple.com/lookup?id=\(collectionId)&entity=song") } }
SearchResultsViewController.swift
import UIKit class SearchResultsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, APIControllerProtocol { var albums = [Album]() var api: APIController! let kCellIdentifier: String = "SearchResultCell" var imageCache = [String:UIImage]() @IBOutlet weak var appsTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() api = APIController(delegate: self) UIApplication.sharedApplication().networkActivityIndicatorVisible = true api.searchItunesFor("Beatles") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return albums.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as UITableViewCell! let album = self.albums[indexPath.row] // Get the formatted price string for display in the subtitle cell.detailTextLabel?.text = album.price // Update the textLabel text to use the title from the Album model cell.textLabel?.text = album.title // Start by setting the cell's image to a static file // Without this, we will end up without an image view! cell.imageView?.image = UIImage(named: "Blank52") let thumbnailURLString = album.thumbnailImageURL let thumbnailURL = NSURL(string: thumbnailURLString)! // If this image is already cached, don't re-download if let img = imageCache[thumbnailURLString] { cell.imageView?.image = img } else { // The image isn't cached, download the img data // We should perform this in a background thread let request: NSURLRequest = NSURLRequest(URL: thumbnailURL) let mainQueue = NSOperationQueue.mainQueue() NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in if error == nil { // Convert the downloaded data in to a UIImage object let image = UIImage(data: data!) // Store the image in to our cache self.imageCache[thumbnailURLString] = image // Update the cell dispatch_async(dispatch_get_main_queue(), { if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) { cellToUpdate.imageView?.image = image } }) } else { print("Error: \(error!.localizedDescription)") } }) } return cell } func didReceiveAPIResults(results: NSArray) { dispatch_async(dispatch_get_main_queue(), { self.albums = Album.albumsWithJSON(results) self.appsTableView!.reloadData() UIApplication.sharedApplication().networkActivityIndicatorVisible = false }) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let detailsViewController: DetailsViewController = segue.destinationViewController as? DetailsViewController { let albumIndex = appsTableView!.indexPathForSelectedRow!.row let selectedAlbum = self.albums[albumIndex] detailsViewController.album = selectedAlbum } } func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.layer.transform = CATransform3DMakeScale(0.1,0.1,1) UIView.animateWithDuration(0.25, animations: { cell.layer.transform = CATransform3DMakeScale(1,1,1) }) } }
DetailsViewController.swift
import UIKit import MediaPlayer class DetailsViewController: UIViewController, APIControllerProtocol { var mediaPlayer: MPMoviePlayerController = MPMoviePlayerController() lazy var api : APIController = APIController(delegate: self) var tracks = [Track]() var album: Album? @IBOutlet weak var tracksTableView: UITableView! @IBOutlet weak var albumCover: UIImageView! @IBOutlet weak var titleLabel: UILabel! required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func viewDidLoad() { super.viewDidLoad() titleLabel.text = self.album?.title albumCover.image = UIImage(data: NSData(contentsOfURL: NSURL(string: self.album!.largeImageURL)!)!) // Load in tracks if self.album != nil { api.lookupAlbum(self.album!.collectionId) } } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tracks.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("TrackCell") as! TrackCell let track = tracks[indexPath.row] cell.titleLabel.text = track.title cell.playIcon.text = "▶️" return cell } // MARK: APIControllerProtocol func didReceiveAPIResults(results: NSArray) { dispatch_async(dispatch_get_main_queue(), { self.tracks = Track.tracksWithJSON(results) self.tracksTableView.reloadData() UIApplication.sharedApplication().networkActivityIndicatorVisible = false }) } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let track = tracks[indexPath.row] mediaPlayer.stop() mediaPlayer.contentURL = NSURL(string: track.previewUrl) mediaPlayer.play() if let cell = tableView.cellForRowAtIndexPath(indexPath) as? TrackCell { cell.playIcon.text = "◾️" } } func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.layer.transform = CATransform3DMakeScale(0.1,0.1,1) UIView.animateWithDuration(0.25, animations: { cell.layer.transform = CATransform3DMakeScale(1,1,1) }) } }
Album.swift
import Foundation struct Album { let title: String let price: String let thumbnailImageURL: String let largeImageURL: String let itemURL: String let artistURL: String let collectionId: Int init(name: String, price: String, thumbnailImageURL: String, largeImageURL: String, itemURL: String, artistURL: String, collectionId: Int) { self.title = name self.price = price self.thumbnailImageURL = thumbnailImageURL self.largeImageURL = largeImageURL self.itemURL = itemURL self.artistURL = artistURL self.collectionId = collectionId } static func albumsWithJSON(results: NSArray) -> [Album] { // Create an empty array of Albums to append to from this list var albums = [Album]() // Store the results in our table data array if results.count>0 { // Sometimes iTunes returns a collection, not a track, so we check both for the 'name' for result in results { var name = result["trackName"] as? String if name == nil { name = result["collectionName"] as? String } // Sometimes price comes in as formattedPrice, sometimes as collectionPrice.. and sometimes it's a float instead of a string. Hooray! var price = result["formattedPrice"] as? String if price == nil { price = result["collectionPrice"] as? String if price == nil { let priceFloat: Float? = result["collectionPrice"] as? Float let nf: NSNumberFormatter = NSNumberFormatter() nf.maximumFractionDigits = 2 if priceFloat != nil { price = "$\(nf.stringFromNumber(priceFloat!)!)" } } } let thumbnailURL = result["artworkUrl60"] as? String ?? "" let imageURL = result["artworkUrl100"] as? String ?? "" let artistURL = result["artistViewUrl"] as? String ?? "" var itemURL = result["collectionViewUrl"] as? String if itemURL == nil { itemURL = result["trackViewUrl"] as? String } if let collectionId = result["collectionId"] as? Int { let newAlbum = Album(name: name!, price: price!, thumbnailImageURL: thumbnailURL, largeImageURL: imageURL, itemURL: itemURL!, artistURL: artistURL, collectionId: collectionId) albums.append(newAlbum) } } } return albums } }
Track.swift
import Foundation struct Track { let title: String let price: String let previewUrl: String init(title: String, price: String, previewUrl: String) { self.title = title self.price = price self.previewUrl = previewUrl } static func tracksWithJSON(results: NSArray) -> [Track] { var tracks = [Track]() for trackInfo in results { // Create the track if let kind = trackInfo["kind"] as? String { if kind=="song" { var trackPrice = trackInfo["trackPrice"] as? String var trackTitle = trackInfo["trackName"] as? String var trackPreviewUrl = trackInfo["previewUrl"] as? String if(trackTitle == nil) { trackTitle = "Unknown" } else if(trackPrice == nil) { print("No trackPrice in \(trackInfo)") trackPrice = "?" } else if(trackPreviewUrl == nil) { trackPreviewUrl = "" } let track = Track(title: trackTitle!, price: trackPrice!, previewUrl: trackPreviewUrl!) tracks.append(track) } } } return tracks } }
TrackCell.swift
import UIKit class TrackCell: UITableViewCell { @IBOutlet weak var playIcon: UILabel! @IBOutlet weak var titleLabel: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } }
swift 资料的更多相关文章
- Swift资料大全
简单看了一下swift的语法,个人感觉相对于object-c很是简单明了.Swift的出现并不能说明iOS开发简单了很多,有可能会变得复杂,你需要学习两门编程语言,因为在程序员的世界里,务实并不是最重 ...
- [转]swift 学习资源 大集合
今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...
- swift 学习资源 大集合
今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...
- 苹果编程语言Swift简介
Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,The Swift Programming Language的原话: Swift is a new programming la ...
- swift UITableViewCell 中的单选控制样式
我昨天在网上找了一晚上的资料,但是大多都是OC得语法,swift资料实在是太少了,使得我这个刚入门swift的彩笔好不吃力,后面一直各种翻阅资料,终于让我找到了 visibleCells 这个方法,直 ...
- 开始Swift学习之路
Swift出来好几个月了,除了同事分享点知识外,对swift还真没有去关心过.GitHub上整理的学习Swift资料还是很不错的,目前也推出了电子书和PDF格式. Swift的语法和我们平常开发的语言 ...
- 关于OpenStack的学习路线及相关资源汇总
首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更 ...
- Swift编程语言资料合集
在本周二凌晨召开的苹果年度开发者大会WWDC上,苹果公司推出了全新的编程语言Swift.Swift 基于C和Objective-C,是供iOS和OS X应用编程的全新语言,更加高效.现代.安全,可以提 ...
- swift 语法 - 以及学习资料
附上一些swift的一下学习资料: 1.Swift语法介绍官方英文版:The Swift Programming Language 2.Swift与Objective-C相互调用Using Swift ...
随机推荐
- 【krpano】汉化Web VR设置界面
欢迎加入qq群551278936讨论krpano解密技术以及获取最新软件 krpano 1.19支持了Web VR功能,允许以VR的方式查看全景图,配合上VR设备可以实现VR效果. 在VR方式查看时, ...
- JVM内存管理------垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- jsp实验二
1.编写一个简单的留言薄,写入留言提交后,显示留言内容 2.编写一个实现页面计数的计数器.思考,如果要求当刷新页面时,不增加计数. 3.编写一个简易购物车,实现向购物车添加商品.思考,如果增加清空购物 ...
- asp.net中membership使用oracle数据库(一)
第一步 数据库的准备 使用 oracle 11g的数据库 需要安装好,安装过程中先决条件检查失败的处理:确认server服务已运行 cmd->net share c$=c: 就可以通过 orac ...
- go:interface{}、断言与类型转换
interface{}可用于向函数传递任意类型的变量,但对于函数内部,该变量仍然为interface{}类型(空接口类型), 不清楚这点将可能导致错误.如以下代码: package main impo ...
- Spring Schedule 任务调度实现
我们都知道任务调度可以用Quartz,但对于简单的定时任务,可以直接用Spring内置的Schedule来实现.可以由两种方式,注释+XML配置 注解方式: 注解也要先在sping.xml配置文件中配 ...
- swap的应用两个数的交换
#include <stdio.h>//这儿表示的函数的输入输出头文件void swap(int x,int y);void swap_p(int *x,int *y);//表示调用一个方 ...
- 结合stack数据结构,实现不同进制转换的算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- 浅析python 中__name__ = '__main__' 的作用
引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...
- 【淘淘】Quartz之集群利弊
一.前言: 虽然单个Quartz实例能给予我们很好的任务job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成 ...