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 ...
随机推荐
- java5
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- JVM内存管理------垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- (转: daifubing的博客 )Delphi二维码中文支持、分组、批量打印经验小结
一直也没接触到什么复杂的报表,都是一些简单的报表,在DelphI下使用QuickReport一般也就能满足需要了,由于公司现在需求的变化,对条码扫描提出了新的要求,主要是扫码要包含更多地内容,以前的一 ...
- Oracle行转列、列转行的Sql语句总结(转)
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...
- 【学习笔记】ES6标准入门
这里简要记录一下对自己感触比较深的几个知识点,将核心的应用投放于实际的项目之中,提供代码的可维护性. 一.let和const { // let声明的变量只在let命令所在的代码块内有效 let a = ...
- iOS 状态栏隐藏显示
在 info.plist 文件中 配置 View controller-based status bar appearance 对应的值为 NO 这样可以使用 application 对象来设置 状态 ...
- CentOS7 FTP服务搭建(虚拟用户访问FTP服务)
概述 最近在搞Oracle在Linux系统下集群,针对Linux系统,笔人也是一片空白.Liunx外部文件的传输,避免不了使用FTP服务,所以现在就整理下,CentOS7环境下,FTP服务的搭建.FT ...
- CodeTimerPerformance EasyPerformanceCounterHelper .NET 4.5
//#define NET35 namespace TestConsoleApplication { using System; using System.Diagnostics; using Sys ...
- Requests库练习
预备知识 字符串方法 用途 string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 ...
- 【maven】maven创建web项目-pom文件提示web.xml is missing and <failOnMissingWebXml> is set to true
使用maven创建web项目,选择war类型后,pom文件红叉 提示web.xml is missing and <failOnMissingWebXml> is set to true ...