首页 文章 精选 留言 我的

精选列表

搜索[Swift开发],共10000篇文章
优秀的个人博客,低调大师

swift-switch使用方法

// Playground - noun: a place where people can play import UIKit //------------------------------------------------------------------------------ // 1. 基本使用 // switch 与OC的差别: // 1> 不须要写break // 2> 每一个分支条件中的指令不能不写 // 3> case假设取多值时。能够使用","分隔 var grand = "a" var result:String switch grand.uppercaseString { case "A": result = "优等 \(grand)" case "B": result = "良" case "C": result = "中" case "D", "E", "F": result = "差" default:result = "未知" } //------------------------------------------------------------------------------ // 2. 变量/常量赋值 // 在case匹配的同一时候。能够将switch中的值绑定给一个特定的常量或者变量,以便在case的语句中使用 var point = (10, 10) switch point { case (let x, 0) : result = "这个点在x轴上, x值是\(x)" case (0, let y) : result = "这个点在y轴上, y值是\(y)" case let (x, y) : result = "这个点的x值是\(x), y值是\(y)" } //------------------------------------------------------------------------------ // 3. where // 使用where能够添加推断条件 var point1 = (10, -10) switch point1 { case let (x, y) where x == y : result = "在 \\ 对角线上" case let (x, y) where x == -y : result = "在 / 对角线上" default : result = "不在对角线上" } //------------------------------------------------------------------------------ // 4. fallthrough // 在运行完当前case后,继续运行后面的case或者default语句 var num = 20 var str = "\(num)是 " switch num { case 0...50: str += "0~50之间的 " fallthrough default : str += "整数" } 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5095072.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Swift:在Safari中打开App

打开之前会发生什么呢,先看看这个图: 我这里只是简单模拟了一下。当你输入一个特殊的“url”之后,Safari弹出一个提示,问你是否继续打开这个App。如果你这个时候confirm的话。那么这个App就会打开。 我们打开看看这个app是什么样的App。看图: 是一个灰常简答的TableView。然后点击某一行的时候会跳转到一个号称是详细也的地方。其实什么都没有。只有一个地方可以看的,那就是这个页面的title。记住这个title,后面的功能展示就全靠他了。 当你跳转到详细页的时候就是这个样子的: 是的就一个title,然后没别的了。 我们接着上文继续。上文说到在Safari中输入一个特殊的“URL”,confirm了Safari的弹出框以后就会打开这个应用。到这里来说只是初级的功能。因为这样显然还是不够的。我们需要的是用户完成confirm弹出框以后可以打开详细页。一步一步来。 1. 在Xcode6+版本中选择你的项目,之后选择infotab。看图: 从左到右一共三步就到了设置url scheme的地方了。图: 在info页面里的最下面有个URL Types,点开以后在里面设置URL Scheme为deeplink,当然了,这里可以按照你需要的方式设置任意的URL Scheme。 到这里,保存一下然后运行你的App。App运行起来以后按下cmd+shift+H,调到app界面。之后打开Safari,在地址栏中输入deeplink://,然后点Go按钮。接下来就会弹出一个comfirm的弹框。点击open,你的app就会打开。图: 1. 在地址栏中输入你定义的url scheme。 2. 点Go按钮后弹出confirm框 点open按钮后,你的app就会打开。 但是。。我们要得不只是这样而已。url scheme能提供给我们的也不只是这样而已。我们要打开的是详细页。 url 有了scheme,那么就可以有后面的一堆东西。比如:http://baidu.com。有了http://后面就可以有baidu.com。我们也可以这样用。在deeplink://后面加入一串数字,用这串数字可以代表很多。在这里我们就用这串数字来代表一个详细页需要展示的产品的产品编号。这些都很简单,但是怎么实现呢??? 其实,很多的App的第三方登录用的就是这个东西。比如微博或者微信的登录或者分享之类的。在选择了登录之后就会跳到微信或者微博里,等登录了以后就可以跳转回去。这些都是用的自定义url scheme。在配置SDK的时候你都会看到这样的要求。使用这样的方法打开的方法是:funcapplication(application:UIApplication, openURL url:NSURL, sourceApplication:String?, annotation:AnyObject?) ->Bool,这个方法是在AppDelegate类中得。默认没有提供实现,需要我们自己添加。 在这个方法执行的时候,添加一段代码:println(url.absoluteString),可以打印出来开启App的url是什么。我们这里当然是,比如,我要包括产品的详细编号的话就是:"deeplink://1234567890"。那么在这里打印出来的就是整个的这个字符串:"deeplink://1234567890"。因为,我们的url scheme是固定不变的。那么我们可以截取产品的具体编号。 varitemCode = (url.absoluteString!asNSString).substringFromIndex(11) 这样就可以获得产品的编号。然后调用window的rootViewController(需要说明的是,我们的rootViewController是UINavigationController)。只需要把产品编号赋值给产品详细页的Controller,让这个Controller使用这个产品编号从服务器后端获取产品的详细信息就可以了。当然在后面的实现中是不包括从后端获取信息的内容的。这些功能也很容易添加。 我们在DetailViewController中添加一个产品编号的属性:varproductDetail:String!。之后,将这个属性赋值给Controller的title,在页面中展示出来。 1 2 3 4 5 6 7 override func viewDidLoad() { super .viewDidLoad() self .view.backgroundColor = UIColor.whiteColor() <em><strong> self .title = self .productDetail</strong></em> } 了解了具体的展示以后,看看如何在上面说到的方法:funcapplication(application:UIApplication, openURL url:NSURL, sourceApplication:String?, annotation:AnyObject?) ->Bool中如何处理页面的跳转,不处理的话只是打开了UINavigationController的rootViewController。 这样的处理其实也很简单。UINavigationController本来已经是rootViewController了,只要push一下初始化好的DetailViewController就完事大吉了。非常简单。代码: 1 2 3 4 5 6 7 8 if let window = self .window, let rootController = window.rootViewController { // self.window?.rootViewController println( "window is cool" ) var navController = rootController as! UINavigationController <em><strong>var detailController = DetailViewController() detailController.productDetail = itemCode navController.pushViewController(detailController, animated: true )</strong></em> } 这样就处理完毕了。打开safari,输入“deeplink://1234567890”,看看运行效果吧: so far so good!但是,还有一个bug。重复多次试验就会看到。想想怎么解决吧,就当是课后作业。 欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处! 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/4527831.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Swift: 用UserDefaults保存复杂对象

一直木有看过这个细节,用UserDefaults是能不能存复杂一点的对象。大家可能都看到过UserDefaults的一个方法setObject: forKey:,用这个方法存过NSDictionary,NSArray什么的,也存过字符串。 偶然一次直接存了一个继承自JSONModel的实体类,然后就悲剧了。后来查了下苹果的文档: Thevalue parameter can be only property list objects:NSData,NSString, NSNumber,NSDate,NSArray, or NSDictionary. ForNSArray andNSDictionary objects, their contents must be property list objects. 简单来说就是setObject:forKey:方法可以存NSData,NSString什么的对象,即使是NSDictionary和NSArray内存放的元素也必须是property list objects的。具体什么是property list object看这里。关于JSONModel可以看这里,还不错。 既然苹果的API已经限制到这个地步了再想别的已经玩不出什么花样了。是的,你可以存文件。不过这里说的还是用UserDefaults嘛。 解决这个问题的核心思想就是把一个对象转换为NSData,或者说是序列化为NSData。序列化的说法不一定准确但是存在这样的一个过程,具体的后面再细说。当一个对象可以转化为NSData了也就适用NSUserDefaults的方法setObject: forKey:了。也就是这样的用法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //假设有一个用户实体类 class UserModel { var userId : String = "" var accessToken : String = "" } //然后 let userModel = UserModel () //正式开始 let userDefaults = NSUserDefaults . standardUserDefaults () let encodedObject = NSKeyedArchiver . archivedDataWithRootObject ( object ) userDefaults . setObject ( encodedObject , forKey : "UserInfoKey" ) userDefaults . synchronize () //最后不要忘了这个 大体的意思在上面的代码中全部都体现出来了。但是如果运行上面的代码肯定是会出错的。 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object UserModel for key UserInfoKey' 因为不是property list object所以执行方法setObject:forKey的时候App直接Crash。 这个问题看似就在property list object上了。但是回到什么说的,我们的思路是把这个自定义的实体类的对象转化为NSData。这个时候就要用到NSKeyedArchiver和NSKeyedUnarchiver,这也就间接的用到了NSCoding接口。因为一个实体类如果没有实现NSCoding那么在NSKeyedArchiver和NSKeyedUnarchiver上还是会出错的。 对上面的代码做一次小小的改进: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class WeiboUserModel : NSObject , NSCoding { //1 struct PropertyKey { static let userIdKey = "userId" static let accessTokenKey = "accessToken" static let expirationDateKey = "expirationDate" static let refreshTokenKey = "refreshToken" } var userId : String ? var accessToken : String ? var expirationDate : NSDate ? var refreshToken : String ? func encodeWithCoder ( aCoder : NSCoder ) { //2 aCoder . encodeObject ( userId , forKey : PropertyKey . userIdKey ) aCoder . encodeObject ( accessToken , forKey : PropertyKey . accessTokenKey ) aCoder . encodeObject ( expirationDate , forKey : PropertyKey . expirationDateKey ) aCoder . encodeObject ( refreshToken , forKey : PropertyKey . refreshTokenKey ) } required init ?( coder aDecoder : NSCoder ) { // 3 userId = aDecoder . decodeObjectForKey ( PropertyKey . userIdKey ) as ? String accessToken = aDecoder . decodeObjectForKey ( PropertyKey . accessTokenKey ) as ? String expirationDate = aDecoder . decodeObjectForKey ( PropertyKey . expirationDateKey ) as ? NSDate refreshToken = aDecoder . decodeObjectForKey ( PropertyKey . refreshTokenKey ) as ? String } } 如此的修改就可以让他们跑起来了。下面依次解释: 1. 实现NSObject和NSCoding。NSObject可以不加,用@objc修饰某些方法也可以。NSCoding接口提供了序列化和反序列化对象的时候的编解码方法。 UserModel的类名称修改 为WeiboUserModel。这部分代码是整个项目的一部分,后面会补齐。 2. 在序列化一个对象的时候使用方法func encodeWithCoder(aCoder: NSCoder)编码。 3. 反序列化的时候用方法init?(coder aDecoder: NSCoder)解码。 在大体逻辑不修改的条件下,我们看下完整的可以存实体类对象的代码。 1 2 3 4 5 6 7 8 //然后 let userModel = WeiboUserModel () //正式开始 let userDefaults = NSUserDefaults . standardUserDefaults () let encodedObject = NSKeyedArchiver . archivedDataWithRootObject ( object ) userDefaults . setObject ( encodedObject , forKey : "UserInfoKey" ) userDefaults . synchronize () //最后不要忘了这个 这样就可以运行了。但是我们不能止步于此。因为如果项目中需要保存的地方太多的时候,到处都写满了(极有可能是复制粘贴)NSUserDefaults实例的调用。这样的代码太过僵化。而且很容易忘记最后的userDefaults.synchronize ()调用。这会导致对象的存储出问题。 所以我们要对这一部分的代码做一定的封装: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 extension NSUserDefaults { //1 func saveCustomObject ( customObject object : NSCoding , key : String ) { //2 let encodedObject = NSKeyedArchiver . archivedDataWithRootObject ( object ) self . setObject ( encodedObject , forKey : key ) self . synchronize () } func getCustomObject ( forKey key : String ) - > AnyObject ? { //3 let decodedObject = self . objectForKey ( key ) as ? NSData if let decoded = decodedObject { let object = NSKeyedUnarchiver . unarchiveObjectWithData ( decoded ) return object } return nil } } 我们把存取的方法都放在NSUserDefaults的扩展里。这样用户在使用的时候就可以和使用NSUserDefaults本身的方法一样的了。而且synchronize()方法也封装在里面了,再也不用担心忘记d对象没有存上了。来看看调用的一个小细节。 1 2 3 userDefaults . saveCustomObject ( customObject : userModel , key : "UserInfoKey" ) //存 userDefaults . getCustomObject ( "UserInfoKey" ) as ? WeiboUserModel //取 好的,到这。完整项目的代码在这里 to be continued 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/5156411.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

swift 为UIView设置投影效果

//视频标题投影 videoBackBtn.layer.shadowOffset = CGSizeMake(3,3) videoBackBtn.layer.shadowOpacity = 1.0; videoBackBtn.layer.shadowColor = UIColor.redColor().CGColor videoBackBtn.layer.shadowRadius = 1 shadowOffset: shadowOffset阴影偏移,x向右偏移4,y向下偏移4,默认(0, -3) shadowOpacity: 阴影透明度,默认0 shadowColor: 投影颜色 shadowRadius: 投影的半径 这四个属性可以配合设置,完成不同的效果。建议自己尝试一下,看看效果。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册