xcode支持swift
2016-05-26 17:10:00 weixin_34405354 阅读数 22

1  TODO 注释

主要用来作方法里面的提示

1846524-82861fc63b19c357.png
todo注释

效果如下图:

1846524-2d6febb1b6d1ac2e.png
显示效果

2 //MARK: - 注释

1846524-c163d5fa73d48d6c.png
MARK: - 注释

效果如下图:


1846524-d6e1eaae22d2bf50.png
效果

3 //pragma MARK: 方法注释

1846524-3c28c6846e2ecd8a.png
pragma MARK: 方法注释

效果如下图:

1846524-b4458e525d193b2b.png

4 FIXME注释


1846524-a1fa2a0b34fece39.png
FIXME注释

效果如下图:


1846524-3f8004cf962f9c79.png
2019-04-01 19:53:00 weixin_33872660 阅读数 5

1、MARK标记
MARK称为代码标注,可以用来添加一些说明,有两种宣誓方式,是否添加分割线

   // MARK:  mark1(上方不带分割线)
    private func mark1() {
        
    }

   // MARK: - mark2(上方不带分割线)
    private func mark2() {
        
    }

效果如下:


1227300-515a4de235edd232.png
mark.png

2、TODO标记
当我们写代码,如果有些功能需要后续再来补全,就可以使用TODO标记来提醒

    // TODO: 后续添加
    private func todo() {
        
    }

效果如下:


1227300-ccce84c3dcfe9f92.png
todo.png

3、FIXME
当需要标记修复BUG的位置时,可以使用FIXME标记来提醒修复

   // FIXME: 修复问题
    private func fixme() {
        
    }

效果如下:


1227300-09e510d409f58e37.png
fixme.png

转载于:https://www.jianshu.com/p/e79a31f49e01

2016-01-31 21:59:00 weixin_33713707 阅读数 27

先借用一句古话装逼,

工欲善其事,必先利其器。

作为一个iOS开发(diao si),首先肯定要将自己的武器打磨好,才能上战场,我们可以给这把武器针对自己的天赋加上合适的附魔,打上合适的宝石,以提高自己的DPS。显然,Xcode 就是武器,虽然苹果 并没有对Xcode插件提供任何技术和文档支持,但如今的Xcode 插件开发流程已经只需要几步,你还有理由不去试一试么?

这不是我的战场,所以我没准备升级武器(前面都是废话)。Duang,那就加个特技吧。

136678-5a168dfbf996e2e4.png
什么玩意儿

开始

Xcode 插件对于你也许不再陌生,但类似这样的特技你一定不常见。

136678-9a58743a243b933e.png
类似这样的特技你一定很少见

下载Demo https://github.com/dimsky/Burberry

是的!接下来我们就开始把XCode 的成功或错误的提示换成你喜欢的恶搞图吧!

老规矩,开始之前 ,先用两分钟完成一个Hello World! 当然,老司机可以略过。

安装插件 Alcatraz

开发之前,我们需要先安装一个插件 Alcatraz, 这是一个非常优秀的XCode 插件管理器,我们可以通过它非常容易的进行插件管理。
输入以下命令在终端安装:

 curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh |sh

等命令执行完成,重启XCode 完成安装。然后会出现以下一个警告,选择 Load Bundle 即可。

136678-7570fedc2af009de.png
加载插件

然后在XCode 的 Window 菜单中会出现 Package Manager 选项,当然,你也可以通过快捷键(⌘⇧9)快速打开。

136678-0cf4676f2ff3f071.png
就是这么个玩意儿

安装插件模板

在很久以前,我们开发一个Xcode 插件可能需要很多的配置修改操作,但幸运的是已经有人替我们完成了这一步,他创建了这样一个模板,插件,到底是插件还是Xcode-Plugin..... - -|| 打开 package manager 安装。

136678-f0384886b70c1401.png
Xcode Plugin Template

安装完成之后 就可以通过新建导航创建 Xcode 插件了

136678-a0a98a4b6386e090.png
新建 Xcode Plugin

肯定是选择Swift ,当然,取一个装逼的名字也很重要。

136678-70f18870270d5b59.png
Burberry

创建完成之后就可以跑起来了,运行后会重新打开一个新的Xcode, 选择加载插件,如果一切顺利的话,打开Edit菜单,就可以看到菜单上的变化了:

136678-2a5993e90fdfbd8f.png
Do Action

点击 Do Action, 一个错误的Hello World 的信息就弹出来了,别担心,你已经成功了 。(如果用Objective-c 弹出来的会是一个正常的Alert 窗口)

136678-26f7acbb7b07c8f1.png
Hello World

Hello World 就这样完成了,是不是还没到两分钟? 看来少年的APM 极高。

完成 Duang

苹果官方并没有对Xcode插件提供任何技术和文档支持,怎么办?

init(bundle: NSBundle) {
    self.bundle = bundle
    super.init()
    center.addObserver(self, selector: Selector("createMenuItems"), name: NSApplicationDidFinishLaunchingNotification, object: nil)
}

从以上代码不难发现,在我们的Hello Wrold 中的菜单是通过监听Notification来完成创建的,那我们应该怎么才能知道build成功的提示会是哪个Notification呢?
NSNotificationCenter 在addObserver(...)方法中说明当name参数传为nil时,将可以监听到所有的Notification。
那么就可以在⌘B build时去查找Xcode 所发出的通知。
在init(...)方法中添加监听

center.addObserver(self, selector: Selector("handlerNotification:"), name: nil, object: nil)

下面把Notification的name装进一个集合,并在收到时打印出来,注意,这里打印要用NSLog(...)。

var notificationSet: NSMutableSet = NSMutableSet();
func handlerNotification(notifi: NSNotification) {
    if !self.notificationSet.containsObject(notifi.name) {
        self.notificationSet.addObject(notifi.name)
        NSLog("---> %@", notifi.name)
    }
}

build 运行,然后在操作Xcode的时候查看控制台的信息,你会发现有很多Notification的name打印出来,先清空,这些都不是我想要的,⌘B build,发现会打印出以下几条,而最后两条会在提示消失后打印,那就先从 NSWindowDidOrderOffScreenNotification 下手吧。

136678-72a3c4b878489485.png
console

在断点约束中写入
notifi.name == "NSWindowDidOrderOffScreenNotification"
执行
po notifi.object
在运行的Xcode ⌘B build ,这时会触发断点
你会发现一个新鲜玩意儿 DVTBezelAlertPanel

136678-fc3c20b8be2e735c.png
debug

好不容易揪出来了,别急,只要你一层一层剥开他的心,你就会发现,就会明白...

LLDB 的image lookup命令将列出所有在内存中实现的方法

image lookup -rn DVTBezelAlertPanel
136678-a8539454fe4b4f9f.png
image lookup

显然你已经发现了这几个方法
[DVTBezelAlertPanel initWithIcon:message:controlView:duration:]
[DVTBezelAlertPanel initWithIcon:message:parentWindow:duration:]
[DVTBezelAlertPanel controlView]

下面我们要做的是注入代码,改变DVTBezelAlertPanel 的行为
我们知道 OC 的runtime可以做很多事情,比如在运行时替换掉某个Xcode的方法,我们只要将该方法与我们自己实现的方法进行运行时调换,从而改为执行我们自己的方法。然后,Duang!这便是运行时的MethodSwizzle 点击下载

打开 NSObject+MethodSwizzler.m

#import "NSObject+MethodSwizzler.h"
#import <objc/runtime.h>

@implementation NSObject (MethodSwizzler)

+ (void)swizzleWithOriginalSelector:(SEL)originalSelector swizzledSelector:(SEL) swizzledSelector isClassMethod:(BOOL)isClassMethod
{
    Class cls = [self class];
    
    Method originalMethod;
    Method swizzledMethod;
    
    if (isClassMethod) {
        originalMethod = class_getClassMethod(cls, originalSelector);
        swizzledMethod = class_getClassMethod(cls, swizzledSelector);
    } else {
        originalMethod = class_getInstanceMethod(cls, originalSelector);
        swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
    }
    
    if (!originalMethod) {
        NSLog(@"Error: originalMethod is nil, did you spell it incorrectly? %@", originalMethod);
        return;
    }
    
    method_exchangeImplementations(originalMethod, swizzledMethod);
}
@end

代码很简单,仅仅是做了一个简单的封装。

我们需要创建一个自定义的方法来替换原有的方法
下面通过message参数判断build 成功或失败,修改配图以及文字:
注意,image.template = NO ,当为Yes 时图片将只有黑色和透明色。

#import "NSObject+Burberry.h"
#import <AppKit/AppKit.h>
#import "Burberry-Swift.h"

@implementation NSObject (Burberry)

- (id)bur_initWithIcon:(id)icon
                message:(NSString *)message
           parentWindow:(id)parentWindow
               duration:(double)duration {
     NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.dimsky.Burberry"];
    if (icon && [Burberry isEnable] && [message containsString:@"Succeeded"]) {
        BurberryImage *burberryImage = [ImageStore makeImage];
        NSImage *image = [bundle imageForResource:burberryImage.imageName];
        if ([self isKindOfClass:[NSPanel class]]) {
            [self bur_initWithIcon:image message:burberryImage.message parentWindow:parentWindow duration:duration];
            NSPanel *panel = (id)self;
            if ([panel.contentView isKindOfClass:[NSVisualEffectView class]]) {
                NSVisualEffectView *e = (id)panel.contentView;
                e.material = NSVisualEffectMaterialTitlebar;
                image.template = NO;
            }
        }
        return self;
    } else if (icon && [Burberry isEnable] && [message containsString:@"Failed"]) {
        NSImage *image = [bundle imageForResource:@"failed.pdf"];
        [self bur_initWithIcon:image message:@"What The Fuck!" parentWindow:parentWindow duration:duration];
        if ([self isKindOfClass:[NSPanel class]]) {
            NSPanel *panel = (id)self;
            if ([panel.contentView isKindOfClass:[NSVisualEffectView class]]) {
                NSVisualEffectView *e = (id)panel.contentView;
                e.material = NSVisualEffectMaterialTitlebar;
                image.template = NO;
            }
        }
        return self;
    }
    return [self bur_initWithIcon:icon message:message parentWindow:parentWindow duration:duration];
}

@end

然后我们要用这个方法来替换掉Xcode原有的方法,替换方法只需要执行一次,所以我们在初始化时使用dispatch_once完成替换。

override class func initialize() {
    struct Static {
        static var token: dispatch_once_t = 0
    }
    dispatch_once(&Static.token) {
        swizzleMethods()
    }
}

class func swizzleMethods() {
    guard let originalClass = NSClassFromString("DVTBezelAlertPanel") as? NSObject.Type else {
        return
    }
    originalClass.swizzleWithOriginalSelector("initWithIcon:message:parentWindow:duration:", swizzledSelector: "bur_initWithIcon:message:parentWindow:duration:", isClassMethod: false)
}

恭喜 你只需要build一下 就会出现特技了!

136678-cf188bc2c793d73a.png
Duang
也许还需要一个开关

比如说女神在你背后的时候 有些图片又恰好出现,是不是就不太合适了。

将开关用NSUserDefaults 记录下来。

 func createMenuItems() {
    removeObserver()

    let item = NSApp.mainMenu!.itemWithTitle("Edit")
    if item != nil {
        let title = Burberry.isEnable() ? "Burberry Default" : "Burberry Custom"
        let actionMenuItem = NSMenuItem(title:title, action:"doMenuAction:", keyEquivalent:"")
        actionMenuItem.target = self
        item!.submenu!.addItem(NSMenuItem.separatorItem())
        item!.submenu!.addItem(actionMenuItem)
    }
}

func doMenuAction(menuItem: NSMenuItem) {
    Burberry.setIsEnable(!Burberry.isEnable())
    menuItem.title = Burberry.isEnable() ? "Burberry Default" : "Burberry Custom"
}

class func isEnable() -> Bool {
   return NSUserDefaults.standardUserDefaults().boolForKey("com.dimsky.burberry")
}

class func setIsEnable(shouldBeEnabled: Bool) {
    NSUserDefaults.standardUserDefaults().setBool(shouldBeEnabled, forKey: "com.dimsky.burberry")
}
136678-0fe319f2f7cfda04.png
开关(Custom/Default)

也许还可以为开关加上一个快捷键。

当然,在build之前你需要确保设置提示是打开的才能看到特技。


136678-33e7c0251e7e5bd7.png
setting
接下来能做些什么?

接下来你可以把你的插件上传至Alcatraz

然后呢?


136678-ce6a47fbd9a5a97a.png
你懂的

你可以悄悄的把插件装在你的同事或者基友的Xcode 里,再看他build 工程时的表情吧。
然后你可以把获取图片方式变为网络请求,由你来控制如何显示,或显示什么,至于显示什么嘛...

显然Xcode 插件能做的不止这些,发挥你的想象力,做更多有用、好玩的东西。

如何删除(卸载)Xcode 插件

如果是通过Alcatraz 来完成的插件安装,点击Remove 即可完成插件卸载。
但如果是通过运行源代码安装的话,可能就需要手动删除了。

cd ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/  rm-r Burberry.xcplugin

然后重启Xcode 完成删除。

UUID

在 Xcode 5 以后, Apple 为了防止过期插件导致的在 Xcode 升级后 IDE 的崩溃,添加了一个 UUID 的检查机制。只有包含声明了适配 UUID,才能够被 Xcode 正确加载,所以Xcode 版本升级之后,插件开发者也需要将新版本Xcode 的UUID 加入其中。

终端执行,获取Xcode UUID:

defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
136678-643dcbeb5efe8d23.png
获取UUID

将UUID 添加至 plist 中的

136678-3fcfb0b031daabb0.png
添加UUID
更多

那些不能错过的Xcode插件
LLDB
X86-64寄存器和栈帧

2016-03-18 22:52:26 wei_developer 阅读数 95

iOS开发——Swift & Xcode

*- 上一节中,我们讨论了一个有趣的问题:“1”+“1”=?
但出乎意料的是,结果是11。
那么这是什么软件,用了什么神奇的代码,能让1+1=11?*

详情见上一节


首先,让我们来了解可以适用于多种语言的强大的开发环境——xcode
这里写图片描述
这里写图片描述

Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由苹果公司开发。Xcode是开发OS X 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。
——百度百科

通过百度百科的介绍可以看出,我们可以用它进行写代码,不过怎么写呢?那些奇奇怪怪的代码代表什么?

这样,我们需要一门编程语言,按照语法编出我们想要的程序
那么就要看看swift
这里写图片描述

Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。
Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。
——百度百科

由此看来,swift是一门很简单的编程语言,那么,我们共同学习这门语言吧!

2016-08-02 15:06:56 yj229201093 阅读数 330

下载的模板地址可以直接使用,但要在项目中创建BaseViewController类 也可以自己修改。

模板地址:http://download.csdn.net/detail/yj229201093/9589557

swift 4 Xcode 9

阅读数 16

图片发自简书App

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