app异常捕获 swift
2018-10-25 18:11:11 Lea__DongYang 阅读数 81

新的异常捕获机制更新于 WWDC 2015上发布的新的Swift2.0,异常的try-catch机制有助于我们更快的定位出错原因所在,此处简单说明下try-catch机制的用法.

 

1.定义枚举异常值

    首先我们可以创建自己的异常枚举值,这要实现ErrorType协议,只不过这个协议是空的,我们加上就好.

 

2.抛出异常

   我们可以在方法中抛出异常,定义抛出异常的方法很简单,只需要在返回值的 -> 前面加上throws就好了,示例如下:(这个方法是自定义的Dog类里的一个实例方法,name.length()是为系统的String类通过延展添加的方法)



 

 

3.捕获异常

  我们可以在调用可能抛出异常的方法后面加上catch关键字来捕获异常


 

 

4.不处理异常

如果确定某段可能抛出异常的代码是不可能抛出异常的,则可以使用try!来进行调用,但是如果一旦这段代码抛出了一个异常,则会引起一个运行时的异常错误,所以请慎用.

结尾:

值得注意的是,在可能抛出异常的方法中,一但有一处抛出了一个异常,那么这个方法则会立刻停止运行.抛出异常代码后面的代码都将不会得到执行

 

 

附自定义Dog类和调用Dog类的代码

enum DogError : ErrorType{
    case NameInvalidError
    case AgeInvalidError
    case NameLengthError
}

class Dog: NSObject {
    var name : String!
    var age : Int!
    init(name:String,age:Int){
        self.name = name
        self.age = age
    }
   
    func printDogMessage(dog:Dog) throws -> String{
        print("Dog-Class:开始检查名字是否无效")
            guard let name : String = dog.name else{
                throw DogError.NameInvalidError
            }
        print("Dog-Class:开始检查名字长度是否无效")
            if name.length() < 3{
                throw DogError.NameLengthError
            }
        print("Dog-Class:开始检查年龄是否无效")
            if age < 0 || age > 20{
                throw DogError.AgeInvalidError
            }
        print("Dog-Class:返回信息")

        return "dog的信息为" + dog.name + "\(dog.age)"

    }

}

 

测试方法的代码:


    

let myDog = Dog(name: "小白", age: 21)

        var str : String!

        do{
        try str = myDog.printDogMessage(myDog)
        }
        catch {
            switch (error){
            case DogError.NameInvalidError: print("dog的名字无效错误")
            case DogError.NameLengthError : print("dog的名字长度错误")
            case DogError.AgeInvalidError : print("dog的年龄设置不合法")
            default:print("Main:捕获到dog其他错误")
            }
        }

        print("Main:最后输出为\(str)")

 

2016-08-05 18:45:00 weixin_34403693 阅读数 16

原文链接:http://blog.csdn.net/mumubumaopao/article/details/50835298

新的异常捕获机制更新于 WWDC 2015上发布的新的Swift2.0,异常的try-catch机制有助于我们更快的定位出错原因所在,此处简单说明下try-catch机制的用法.

1.定义枚举异常值

首先我们可以创建自己的异常枚举值,这要实现ErrorType协议,只不过这个协议是空的,我们加上就好.

1232108-21e9b2b2eb0047ef

2.抛出异常

我们可以在方法中抛出异常,定义抛出异常的方法很简单,只需要在返回值的 -> 前面加上throws就好了,示例如下:(这个方法是自定义的Dog类里的一个实例方法,name.length()是为系统的String类通过延展添加的方法)

1232108-07f26f96a7853ac2

3.捕获异常

我们可以在调用可能抛出异常的方法后面加上catch关键字来捕获异常

1232108-1ac315b87b09ea59

4.不处理异常

如果确定某段可能抛出异常的代码是不可能抛出异常的,则可以使用try!来进行调用,但是如果一旦这段代码抛出了一个异常,则会引起一个运行时的异常错误,所以请慎用.

结尾:

值得注意的是,在可能抛出异常的方法中,一但有一处抛出了一个异常,那么这个方法则会立刻停止运行.抛出异常代码后面的代码都将不会得到执行

附自定义Dog类和调用Dog类的代码

enumDogError :ErrorType{

caseNameInvalidError

caseAgeInvalidError

caseNameLengthError

}

classDog:NSObject{

varname :String!

varage :Int!

init(name:String,age:Int){

self.name= name

self.age= age

}

funcprintDogMessage(dog:Dog)throws->String{

print("Dog-Class:开始检查名字是否无效")

guardletname :String= dog.nameelse{

throwDogError.NameInvalidError

}

print("Dog-Class:开始检查名字长度是否无效")

ifname.length() <3{

throwDogError.NameLengthError

}

print("Dog-Class:开始检查年龄是否无效")

ifage<0||age>20{

throwDogError.AgeInvalidError

}

print("Dog-Class:返回信息")

return"dog的信息为"+ dog.name+"\(dog.age)"

}

}

测试方法的代码:

letmyDog =Dog(name:"小白", age:21)

varstr :String!

do{

trystr = myDog.printDogMessage(myDog)

}

catch{

switch(error){

caseDogError.NameInvalidError:print("dog的名字无效错误")

caseDogError.NameLengthError :print("dog的名字长度错误")

caseDogError.AgeInvalidError :print("dog的年龄设置不合法")

default:print("Main:捕获到dog其他错误")

}

}

print("Main:最后输出为\(str)")

加入审核被拒交流群,一起交流审核上架经验吧~~ 群号:689757099

2016-03-31 11:20:00 weixin_34347651 阅读数 3

1. 使用 interface Builder 快速构建原型 --- Main.storyboard

2.  CocoaPods :包管理工具,管理 Objective-C 的组件

Cocoa: 苹果提供给开发者的 API,通过 Cocoa 我们就可以操作 Mac OS 系统了

安装: $ sudo gem install cocoapods

3. core location 用于 编写基于地理位置信息的 App

import CoreLocation

转载于:https://www.jianshu.com/p/308c1a554f0f

2017-11-08 15:03:37 luolianxi 阅读数 1150
Swift有对应的版本更新库(Siren),有需要的可以参考和使用。

iOS开发中,有时会有这种需求,在AppStore上出现新版本时,应用内弹窗提示用户更新.自动提示更新的实现方案分为两种:

第一种,自己服务器提供一个接口,通过请求,获取app的相关的版本信息,如:是否需要更新,以及更新的地址等信息
第二种,就是利用苹果的appstore 提供的相关api进行查询更新.http://itunes.apple.com/cn/lookup?id=你的APPId

采用方案1,实现逻辑:

1: 向自己服务器请求当前版本信息
2: 和App当前版本进行比较,如果返回的版本比当前本地版本新,弹窗并显示更新日志,根据点击的按钮,控制用户跳转到AppStore更新

简单实现
效果图:



具体代码实现

[javascript] view plain copy
  1. struct VersionInfo {  
  2.     var url: String        //下载应用URL  
  3.     var title: String       //title  
  4.     var message: String       //提示内容  
  5.     var must_update: Bool  //是否强制更新  
  6.     var version: String     //版本  
  7. }  
  8.       
  9. class VersionManager: NSObject {  
  10.       
  11.     //本地版本  
  12.    private static func localVersion() -> String? {  
  13.         return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String  
  14.     }  
  15.       
  16.     static func versionUpdate() {  
  17.         //1 请求服务端数据,并进行解析,得到需要的数据  
  18.         //2 版本更新  
  19.         handleUpdate(VersionInfo(url: "应用下载地址", title: "有新版本啦!", message: "提示更新内容,解决了xxx等一系列问题,新增了xxx等功能!", must_update: false, version: "3.5"))  
  20.     }  
  21.       
  22.     /// 版本更新  
  23.    private static func handleUpdate(_ info: VersionInfo) {  
  24.         guard let localVersion = localVersion()else { return }  
  25.         if isIgnoreCurrentVersionUpdate(info.version) { return }  
  26.         if versionCompare(localVersion: localVersion, serverVersion: info.version) {  
  27.             let alert = UIAlertController(title: info.title, message: info.message, preferredStyle: .alert)  
  28.             let update = UIAlertAction(title: "立即更新", style: .default, handler: { action in  
  29.                 UIApplication.shared.open(URL(string: info.url)!)  
  30.             })  
  31.             alert.addAction(update)  
  32.             if !info.must_update { //是否强制更新  
  33.                 let cancel = UIAlertAction(title: "忽略此版本", style: .cancel, handler: { action in  
  34.                     UserDefaults.standard.set(info.version, forKey: "IgnoreCurrentVersionUpdate")  
  35.                 })  
  36.                 alert.addAction(cancel)  
  37.             }  
  38.             if let vc = UIApplication.shared.keyWindow?.rootViewController {  
  39.                 vc.present(alert, animated: true, completion: nil)  
  40.             }  
  41.         }  
  42.     }  
  43.       
  44.    // 版本比较  
  45.    private static func versionCompare(localVersion: String, serverVersion: String) -> Bool {  
  46.         let result = localVersion.compare(serverVersion, options: .numeric, range: nil, locale: nil)  
  47.         if result == .orderedDescending || result == .orderedSame{  
  48.             return false  
  49.         }  
  50.             return true  
  51.     }  
  52.       
  53.     // 是否忽略当前版本更新  
  54.     private static func isIgnoreCurrentVersionUpdate(_ version: String) -> Bool {  
  55.         return UserDefaults.standard.string(forKey: "IgnoreCurrentVersionUpdate") == version  
  56.     }  
  57. }  

简单说明:
1 代码的实现很简单,上面只是简单写了一个测试数据,真正的数据需要自己在每次程序启动之后向服务端请求数据。
2 提供了获取本地版本、版本更新、版本比较、是否忽略当前版本更新等4个方法。isIgnoreCurrentVersionUpdate方法是表示当用户选择忽略版本之后下次启动程序,对于当前版本不再进行更新提示


Swift有对应的版本更新库(Siren),有需要的可以参考和使用。


2017-03-13 12:41:10 weixin_33932129 阅读数 2

如何通过通过纯粹的代码,而不依赖于Xcode的StoryBoard,来完成一个App?

首先做些操作性的工作,具体过程是这样的:

  1. 打开xcode

  2. 创建一个Single View App

Xcode会进入主要编辑界面。此时,我们打开AppDelegate.swift文件然后覆盖源代码为如下:

    import UIKit
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window : UIWindow?
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            window = UIWindow()
            window!.rootViewController = UIViewController()
            window!.rootViewController!.view.backgroundColor = .blue
            window!.makeKeyAndVisible()
            return true
        }
    }

运行后发现手机(或者仿真器)满屏的蓝色背景就说明成功了。

一起来看看代码。

我们需要导入UIKit:


    import UIKit

框架UIKit用来构造和管理用户界面、响应用户交互和系统事件。既然需要创建App,引入UIKit是第一件需要做的工作。

接着查看AppDelegate类。它实现协议UIApplicationDelegate,且必须被标记为@UIApplicationMain,两者配合就设置了App的程序入口点。AppDelegate实现了此协议中规定的函数:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

这样,UIKit就会在完成App启动调用此函数,从而App可以再次实现自己的初始化逻辑。

在本案例中,我们在启动函数中创建了window实例,它是UIWindow的实例。代码随即把window属性的rootViewController设置为UIViewController的实例。

为了可视化的看到我们的工作成果,我们设置UIViewController的背景色为蓝色,设置的方式就是把属性view背景色设置为蓝色,此属性是类UIView的实例。

这样,我们完成了最基本的一个UI界面。

window和view是构建UI的关键构造块,因此有必要澄清下概念。

每个应用都有一个window,这个window并没有任何外观形象,每个view都是被window包含在内的,事件处理也是首先路由到相应的window对象然后被导向到对应的视图。

View定义了一个屏幕上的矩形区域,并且管理此区域的内容和用户交互。window通过一个rootViewController的属性view开始关联,然后在此view内可以通过addSubView加入更多的子视图来完成UI的构建。

随后我们会接触更多的view类型,实际上按钮(UIButton)、标签(UILabel)等可以看到和交互的控件都是视图的子类,View的使用时非常广泛的。

可能很多人会觉得AppDelegate这个名字过于冗长。为此我们得了解一个叫做Delegate的设计模式。Delegate是一个简单而强大的设计模式,可以让其中一个对象委托一部分功能给另外一个对象。做法就是发起对象持有委托对象的实例,并在适当的时间发起消息给委托对象,告诉委托对象将要发生的事件或者已经发生的事件。委托对象可以更新用户界面或者更新自己的状态作为响应。

在此案例中,关于委托牵涉到了两个类包括UIApplication、AppDelegate,以及一个协议为UIApplicationDelegate,UIApplication委托事件给AppDelegate,这里的委托事件就是:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

以便让在UIApplicationDelegate的对象可以完成自己的初始化代码。UIApplication和UIApplicationDelegate之间可以建立一个协议,此协议规定两者之间可以委托的具体内容,此协议就是UIApplicationDelegate规定的,可以通过手册了解此协议的更多资料。

这样,我们了解到了建造一个App涉及到的最少的类:UIApplication、UIApplicationDelegate、UIWindow、UIViewController,以及UIKit大量使用的委托设计模式,未来的文字将会以此为垫脚石。

swift App内购

阅读数 2941

准备:先要在iTunesConnect进行相关设置我的App中 找到对应APP,在[功能->App内购买项目]列表中添加消耗型项目和非消耗型项目用户和职能中 添加沙箱技术测试员协议、税务和银行业务中 设置款项合同的联系人信息、银行信息和税务信息////ViewController.swift//neigoutest////

博文 来自: callzjy

swift App版本更新

阅读数 878

参考:https://my.oschina.net/realfighter/blog/704612审核不允许有自动更新的功能按钮。不然审核通不过。但是我们可以把更新功能做成一个隐含的。不带更新界面不就ok了(其实还有一个更狠的,审核的时候把更新按钮隐藏,审核通过后再显示更新按钮):审核通过后由服务端发送一个信号显示更新按钮就行了。6不6今天要做的是检测更新,提醒用户有新版本

博文 来自: wei_chong_chong

swift -单糖app

阅读数 625

单糖——良品生活指南:家居零食、礼物美妆、海淘购物感兴趣的朋友可以去appstore下载iOS版下载地址说明本程序仅供学习交流,不可用于任何商业用途。说明因为公司使用的是Objective-C开发app,没有使用swift来开发,所以决定自己研究Swift,研究Swift的时间不长,对于Swift的基本语法有了大致的了

博文 来自: yangmeng13930719363

最小的Swift App

阅读数 11

如何通过通过纯粹的代码,而不依赖于Xcode的StoryBoard,来完成一个App?首先做些操作性的工作,具体过程是这样的:打开xcode创建一个SingleViewAppXcode会进入主要编辑界面。此时,我们打开AppDelegate.swift文件然后覆盖源代码为如下:importUIKit@UIApplicationMainclassAp...

博文 来自: weixin_33735676

Swift App状态恢复

阅读数 45

原创Blog位置:https://blog.csdn.net/hello_hwc/article/details/45146305前言:对于一个app来说,没有办法保证每次都是用户正常关闭(双击home,然后关闭)。有可能是用户把app切换到后台,然后由于内存的原因,IOS系统选择关闭掉应用。这时候,就是状态恢复使用的场景。App应当做到的是,用户没有察觉到App在后台被IOSKi...

博文 来自: weixin_40918107
没有更多推荐了,返回首页