debug 修改swift_swift debug - CSDN
  • 同OC一样,swift也是依靠重写description来改变打印的内容。只不过,OC的description是重写了方法,Swift是重写了属性。并且可以把这个属性重写的方法写到分类中。在之前Swift版本,是可以通过分类重写...

      一般的枚举,打印时候会显示枚举信息,但是一般的对象,打印的时候只会显示类名称和内存空间了。同OC一样,swift也是依靠重写description来改变打印的内容。只不过,OC的description是重写了方法,Swift是重写了属性。并且可以把这个属性重写的方法写到分类中。在之前Swift版本,是可以通过分类重写CustomStringConvertible协议和CustomDebugStringConvertible协议,修改description来实现。目前版本应该是NSObject自身就遵守了这两个协议,所以会提示重复定义的错误。但是并不影响description的使用。

      我们来创建一个Person类:

      

    import UIKit
    
    class Person: NSObject {
        
        var name : String?
        var age : Int = 18
        
    }
    
    extension Person{
        
        override var description: String {
            
           return "Person类对象的名字是:\(self.name),年龄是:\(self.age)"
            
        }
        
        
        
    }

      此时创建Person,赋值name和age,打印:

      

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let p = Person()
            p.name = "axx"
            p.age = 18
            print(p)
        }
    
    }

      结果:

      Person类对象的名字是:Optional("axx"),年龄是:18

     

    转载于:https://www.cnblogs.com/sgxx/p/6207513.html

    展开全文
  • 更新Xcode8之后之前用Swift2.3写的程序运行不起来。 原因:Xcode 8 兼容Swift 2.3 和 3.0 两种版本,默认为3.0 解决方法:Target - Build Settings 选择Yes即可。

    更新Xcode8之后之前用Swift2.3写的程序运行不起来。

    原因:Xcode 8 兼容Swift 2.3 和 3.0 两种版本,默认为3.0

    解决方法:Target -  Build Settings

    选择Yes即可。

    展开全文
  • 插件1:SDE(Swift Development Enviroment)是VSCode插件商城的一个插件,他提供了代码补全功能,注意要下载作者为vknabel的版本,它支持最新版的Swift。 插件2:运行Swift代码需要安装Code Runner插件 ...

    0. 前置工作

    • 下载VSCode (Visual Studio Code),它是微软出品的一个全栈Code Editor,类似于Atom。
    • 插件1:SDE(Swift Development Enviroment)是VSCode插件商城的一个插件,他提供了代码补全功能,注意要下载作者为vknabel的版本,它支持最新版的Swift。
    • 插件2:运行Swift代码需要安装Code Runner插件

    1. 下载Swift的Toolchain

    有两个途径,一个是从Swift.org可以下载到最新版

    第二条路径,利用一个叫swiftenv的Swift的包管理工具,它的特别之处是可以从这里能下载到旧版的Swift.

    我们这里下载SDE标明支持的Swift 4.0.3版

    安装swiftenv

    brew install kylef/formulae/swiftenv
    复制代码

    配置swiftenv

    $ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile
    
    $ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.zshrc
    
    $ echo 'if which swiftenv > /dev/null; status --is-interactive; and source (swiftenv init -|psub); end' >> ~/.config/fish/config.fish
    复制代码

    安装好之后通过这个命令查找它支持的历史版本

    swiftenv install --list
    复制代码

    去下载SDE支持的版本的Swift

    swiftenv install x.x
    复制代码

    2. 安装SDE的底层库SourceKite

    控制台输入

    cd ~
    
    git clone https://github.com/jinmingjian/sourcekite.git
    
    cd sourcekite
    
    swift build -Xswiftc -framework -Xswiftc sourcekitd -Xswiftc -F -Xswiftc /Library/Developer/Toolchains/swift-latest.xctoolchain/usr/lib -Xlinker -rpath -Xlinker /Library/Developer/Toolchains/swift-latest.xctoolchain/usr/lib
    复制代码

    VSCode进入设置,修改swift.path.sourcekite

    {
        "swift.path.sourcekite": "/Users/<#YourName#>/sourcekite/.build/x86_64-apple-macosx10.10/debug/sourcekite"
    }
    复制代码

    可以在Finder里搜索一下sourcekite,看一下路径

    3. 完成

    可以愉快的打代码了


    附录

    • swift toolchain目录:/Library/Developer/toolchain

    确保版本为SDE支持的版本

    • swiftenv version目录: /Users/<#YourName#>/.swiftenv/version

    确保版本号为toolchain中的版本号

    展开全文
  • 需求:需要实现项目中根据...1、新建一个swift 项目 2、创建callkit扩展:选择file-&gt;new-&gt;target,选择Call Directory Extension,输入扩展的名称,创建好后选择Activate   3、想实现项目...

    需求:需要实现项目中根据号码从服务器查询返回的标记写入calllkit放骚扰标记系统库中,来电时显示该标记

    最终的效果如图所示:

    一、准备工作

    1、新建一个swift 项目

    2、创建callkit扩展:选择file->new->target,选择Call Directory Extension,输入扩展的名称,创建好后选择Activate

     

    3、想实现项目与扩展的数据共享,需要打开Capabilities-->App Groups的开关,并点击“+”新建一个app groups(一般命名是以group. 开头)

    4、同样的,项目中也需要打开Capabilities-->App Groups的开关,选择3中创建好的app groups

    5、运行程序,需要在设置-->电话-->来电阻止与身份识别-->找到项目打开对应的开关

    准备工作做好了,下面代码逻辑的展示

    1、在主界面创建3个按钮,分别为 检查权限、写入共享数据、读取共享数据

    1)创建扩展Manager、文件Manager、存储数据的dic、以及app group的url,并初始化

    var exManager : CXCallDirectoryManager!
        
        var fileManager : FileManager!
        
        var dic: NSMutableDictionary!
        
        var containURL : URL!
     
    override func viewDidLoad() {
            super.viewDidLoad()
            dic = NSMutableDictionary.init()
            exManager = CXCallDirectoryManager.sharedInstance
            fileManager = FileManager.default
            
            dic.setValue("中介", forKey: "8613120076711")
            dic.setValue("骗子", forKey: "8612345678901")
            
        }


    2)检查权限:目的是检查callkit标记功能的权限是否开启(开启方法:见上面第5条),若未开启,数据是无法写入系统标记库的,需要用户手动开启

    exManager.getEnabledStatusForExtension(withIdentifier: CALLKITEX_IDENTIFIER) { (status : CXCallDirectoryManager.EnabledStatus, error) in
                if error != nil{
                    self.promissiondDesLabel.text = "权限获取发生错误"+error.debugDescription
                }else{
                    switch status {
                    case .disabled:
                        self.promissiondDesLabel.text = "权限未开启"
                        break
                    case .enabled:
                        self.promissiondDesLabel.text = "权限已开启"
                        break
                    default:
                        self.promissiondDesLabel.text = "权限未知"
                        break
                    }
                }
            }


    3)写入共享数据:在app group中创建共享文件,并将数据存储到文件里,然后将数据录入系统

    self.containURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: APPGROUP_IDENTIFIER)
            self.containURL = containURL.appendingPathComponent(FILE_NAME)
            let filepath = self.containURL.path
            let jsonStr = NSMutableString.init()
            jsonStr.append("[")
            for (number,identifier) in dic {
                let number = number as! String
                let identifier = identifier as! String
                let dicStr = String.init(format: "{\"%@\":\"%@\"},\n", number,identifier)
                jsonStr.append(dicStr)
            }
            jsonStr.append("]")
            
            print("jsonstr \(jsonStr)")
            
            do{
                try jsonStr.write(toFile: filepath, atomically: true, encoding: String.Encoding.utf8.rawValue)
            }catch let error {
                print("写入文件出错 \(error)")
            }
            
            //将数据录入系统
            if self.promissiondDesLabel.text == "权限已开启" {
                exManager.reloadExtension(withIdentifier: CALLKITEX_IDENTIFIER) { (error) in
                    if error != nil{
                        print("写入系统出错 \(error)")
                    }else{
                        print("写入系统成功")
                    }
                }
            }


    注:写入报错主要有以下几个原因:

    (1)Error Domain=com.apple.CallKit.error.calldirectorymanager Code=1 ;CXErrorCodeCallDirectoryManagerErrorNoExtensionFound 该错误可能出现的原因是identifier   设置的不对 注意不要使用app groups 使用的是Call Directory Extension 的identifier

    (2)Error Domain=com.apple.CallKit.error.calldirectorymanager Code=2 ;CXErrorCodeCallDirectoryManagerErrorLoadingInterrupted加载时被中断有可能是因为addAllIdentificationPhoneNumbersToContext中数据处理出错,打断点调试一下

    (3)Error Domain=com.apple.CallKit.error.calldirectorymanager Code=3;CXErrorCodeCallDirectoryManagerErrorEntriesOutOfOrder可能是因为加载数据格式错误比如号码中带有符号,号码没有增序排列

    (4)Error Domain=com.apple.CallKit.error.calldirectorymanager Code=4;CXErrorCodeCallDirectoryManagerErrorDuplicateEntries可能是的数据有重复

    (5)Error Domain=com.apple.CallKit.error.calldirectorymanagerCode=6;CXErrorCodeCallDirectoryManagerErrorExtensionDisabled 权限未打开

    3)读取共性数据:目的在于查看数据是否已经写入系统,并且可读取

    self.containURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: APPGROUP_IDENTIFIER)
            self.containURL = containURL?.appendingPathComponent(FILE_NAME)
            //打开文件,如果file为nil则说明文件不存在
            let file = fopen((self.containURL?.path as NSString?)!.utf8String, "r")
            if  file==nil {
                print("共享文件不存在_说明尚未写入数据")
            }else{
                print("共享文件存在")
                var str:String!
                var jsonData : Data!
                var array : NSMutableArray = NSMutableArray.init()
                var dic : NSMutableDictionary = NSMutableDictionary.init()
                do {
                    str = try String.init(contentsOf: containURL!, encoding: String.Encoding.utf8)
                    jsonData = str.data(using: String.Encoding.utf8)!
                    let originalArray = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers)
                    if (originalArray as AnyObject).isKind(of: NSArray.classForCoder()){
                        print("解析类型是数组")
                        array.addObjects(from: originalArray as! [Any])
                        if array.count == 0 {
                            return
                        }
                        
                        //2、利用数组去重
                        var temp  = [NSDictionary]()
                        var idxArr = [String]()
                        for dic in array{
                            let dic = dic as! NSDictionary
                            let number = dic.allKeys[0] as! String
                            let identifier = dic.allValues[0] as! String
                            if !idxArr.contains(number){
                                idxArr.append(number)
                                temp.append(dic)
                            }
                        }
                        print("解析类型是数组 temp  \(array) \(temp)")
                    }else{
                        print("解析类型是字典")
                        for (number, identifier) in (originalArray as! NSDictionary){
                            dic.setValue(identifier, forKey: number as! String)
                        }
                        print("解析类型是字典 temp  \(originalArray) \(dic)")
                    }
                    
                }catch let error {
                    print("共享内存读取失败 \(error)")
                }
            }


    2、查看创建好的扩展,里面有个CallDirectoryHandler.swift的文件,号码写入系统标记库的逻辑就是在这个类里面执行

    注:ios11中callkit扩展新增了两个方法,由于需要兼容10及以上的版本,所以将多出来的以及没用到方法注释掉了

    目的:将共享目录中对应文件的数据读取出来,添加到系统让骚扰标记库中

    号码的格式需要注意:1)拦截号码或者号码标识的情况下,号码必须要加国标区号!,

                                           2)数组内号码要按升序排列

    里面主要用到了两个方法

    1)beginRequest //开始请求的方法,在打开设置-电话-来电阻止与身份识别开关时,系统自动调用

    2)addAllIdentificationPhoneNumbers //添加标记号码:根据生产的模板,只需要修改CXCallDirectoryPhoneNumber数组,数组内号码要按升序排列

    具体代码如下:

     

    //拦截号码或者号码标识的情况下,号码必须要加国标区号!!!!!!!!
     
    import Foundation
    import CallKit
     
    class CallDirectoryHandler: CXCallDirectoryProvider {
     
        //开始请求的方法,在打开设置-电话-来电阻止与身份识别开关时,系统自动调用
        override func beginRequest(with context: CXCallDirectoryExtensionContext) {
            context.delegate = self
     
            addAllIdentificationPhoneNumbers(to: context)
     
            context.completeRequest()
        }
     
     
        //添加标记号码
        private func addAllIdentificationPhoneNumbers(to context: CXCallDirectoryExtensionContext) {
            
            var containerURL : URL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.group.com.callkit")!
            containerURL = containerURL.appendingPathComponent("data")
            //打开文件,如果file为nil则说明文件不存在
            let file = fopen((containerURL.path as NSString?)!.utf8String, "r")
            if   file == nil {
                return
            }
            //        containerURL = containerURL?.appendingPathComponent("Library/Caches/callkit.json")
            var str:String!
            var jsonData : Data!
            var array : NSArray!
            do {
                str = try String.init(contentsOf: containerURL, encoding: String.Encoding.utf8)
                jsonData = str.data(using: String.Encoding.utf8)!
                array = (try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSArray)!
                if array.count == 0 {
                    return
                }
                print("string extension "+str+" \(jsonData) \(array) ")
                for dic in array {
                    let dic = dic as! NSDictionary
                    let number = dic.allKeys[0]
                    let identifier = dic.allValues[0]
                    print("string extension  \(number) \(identifier) ")
                    let phoneNum = CXCallDirectoryPhoneNumber(truncating: NSNumber.init(value: ((number as? NSString)?.integerValue)!))
                    context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNum, label: identifier as! String)
                }
            }catch let error {
                print("string extension error \(error)")
            }
        }
     
    }
     
    extension CallDirectoryHandler: CXCallDirectoryExtensionContextDelegate {
     
        func requestFailed(for extensionContext: CXCallDirectoryExtensionContext, withError error: Error) {
            // An error occurred while adding blocking or identification entries, check the NSError for details.
            // For Call Directory error codes, see the CXErrorCodeCallDirectoryManagerError enum in <CallKit/CXError.h>.
            //
            // This may be used to store the error details in a location accessible by the extension's containing app, so that the
            // app may be notified about errors which occured while loading data even if the request to load data was initiated by
            // the user in Settings instead of via the app itself.
        }
     
    }


    demo链接:demo下载

    如果上面的链接打不开-->github下载

    展开全文
  • Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽。今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中是如何抛出异常的。在编译...
  • 使用LLDB调试Swift

    2017-10-13 16:57:10
    http://www.infoq.com/cn/news/2017/10/LLDB-debug-Swift?utm_source=tuicool&utm_medium=referral 作为开发者,我们工作70%的时间都用于调试。20%用于架构设计和团队沟通,仅有10%的时间用于写代码。 ...
  • Swift_3.0 相对于 Swift_2.2 版本发生了哪些的变化。本文件将以最直观的代码对比以及文字分析阐述。
  • swift详解之二十九——谈谈debug的一些高级用法lldb在软件编程中,debug是一项必须掌握的技术。怎么去打一个断点,怎么单步调试怎么step into 一个方法就不再赘述 主要来看看一些lldb常用的命令 po(print object)...
  • 神奇的 Swift 错误处理

    2016-08-01 10:54:02
    原文:Magical Error Handling in Swift 作者: Gemma Barlow 译者:kmyhy Swift 中的错误处理从 O-C 沿袭而来,但 Swift 1.0 之后逐渐发生了巨大改变。重要的改变发生在 Swift 2,它率先使用了“处理非异常的...
  • 参考:debug断点调试https://www.jianshu.com/p/55ce421e47e9 1.Condition:输入框内添加 Bool 表达式,使用 Swfit 的语法,使用的变量仅限于断点所在类以及所在函数栈中的变量。如果不添加约束条件...
  • Swift写服务端 — Perfect框架学习(一)一、Perfect简介Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS和macOS (OS X)上使用。该软件体系为Swift工程师量身定制了一整套用于...
  • iOS #ifdef DEBUG 详解

    2017-01-07 21:28:17
    1> #ifdef DEBUG代码块 #ifdef DEBUG  NSLog(@"Debug 模式的代码..."); #else  NSLog(@"Release 模式的代码..."); #endif 2> xcode 切换 debug 和 release版本 如果要测试在不同模式下代码的运行...
  • Swift 属性值监测

    2015-08-26 10:31:59
    Swift提供了一种更加简单的实现方式 当我们需要对对象的属性值进行赋值的时候,可以使用willSet和didSet进行对象属性值变化的观察。 我们直接看一个例子吧。创建一个类 Student 对属性 name进行监测 首先是Student...
  • 原文:Building a Custom Collection in Swift 作者:Eric Cerney 译者:kmyhy 数组、字典和集合是常见的集合类型,它们都内置在 Swift 标准库中。但如果它们不能满足你的 App 的需要的时候怎么办?一种最常见的...
  • 一、选择项目工程,其次选择 Edit Scheme二、在弹框中选择 Run => Info => Build Configuration 选择中进行 Debug 和 Release 的切换
  • 本文旨在帮助开发者快速从OC开发过渡到Swift开发,挑选了一些比较浅显的但是比较常用的Swift语法特性,在介绍的过程中,通常会拿OC中的语言特性作比较,让大家更好的注意到Swift的不同。 另外需要说明的是,笔者也...
  • 遇到这个问题已经很久了,由于忙于开发就没去管它,今天抽空看看问题并解决它,并记录下来,希望能帮那些也遇到这种的小伙伴们脱离苦海,阿弥陀佛~ 打断点运行项目并停于断点处,...Debug info from this module w...
  • Swift 包管理器教程

    2017-05-05 09:00:09
    原文:An Introduction to the Swift Package Manager 作者: Mikael Konutgan 译者:kmyhy Swift 包管理器的正式发布是随着 Swift3.0 一起发布的,它是一个用于构建能够运行在 macOS 和 Linux 上的 Swift 库和 ...
  • Instruments Swift教程:开始 原文:Instruments Tutorial with Swift: Getting Started 作者:Nicholas Sakaimbo 译者:kmyhy 更新说明:本教程由 Nicholas Sakaimbo 升级至 iOS 11\Xcode 9\Swift 4。...
  • 大熊猫猪·侯佩原创或翻译作品....swift大多数情况下我们直接用默认的print函数打印就可以了,不过有些情况可能要做写修改. 比如我们想打印非换行信息怎么办?print默认会在每行输出后加一个换行符. 注意S...
1 2 3 4 5 ... 20
收藏数 3,492
精华内容 1,396
关键字:

debug 修改swift