xcode9开发swift
2017-07-14 16:25:00 weixin_33857679 阅读数 13

OC -> Swift :

https://objectivec2swift.com/#/home/converter/

三十天三十个 Swift 项目:

http://www.jianshu.com/p/52032bc4cbe4

Swift -- 中文版两大官方文档汇总:

http://www.cocoachina.com/industry/20140613/8818.html

学习Swift,一定不能错过的10大开源项目:

http://www.cocoachina.com/ios/20141013/9896.html

Swift 必备开发库 (高级篇):

http://www.jianshu.com/p/f38f1882dcc7

GitHub上Swift语言开源项目:

http://www.jianshu.com/p/0797ca000ee1

iOS Swift 资料分享:

http://www.jianshu.com/p/4a1978845eac

开始用Swift开发iOS:

http://www.jianshu.com/p/a0e95a29ef37

持续更新中。。。

文章版权 归以上链接原作者所有!!!

2015-01-06 09:28:09 u010130947 阅读数 932
马大哈CEO
swift UIScrollView

//

//  ScrollViewController.swift

//  UIControlDemo

//

//  Created by   on 14/12/1.

//  Copyright (c) 2014年 马大哈. All rights reserved.

//

 

import UIKit

 

class ScrollViewController: BaseViewController ,UIScrollViewDelegate{

    

    var scroll: UIScrollView?

    var pageControl:UIPageControl?

 

    override func viewDidLoad() {

        super.viewDidLoad()

        

        self.title = "当前索引: 1 / 5"

        

        scroll = UIScrollView(frame: CGRectMake(0, 100, self.view.frame.size.width, 200))

        scroll?.backgroundColor = UIColor.redColor()

        scroll?.delegate = self

        scroll?.showsHorizontalScrollIndicator = true

        scroll?.showsVerticalScrollIndicator = true

        scroll?.pagingEnabled = true

        self.view.addSubview(scroll!)

        

        for var indexInt = 0; indexInt < 5; ++indexInt{

            

            var xLoca = CGFloat(indexInt) * CGFloat(self.view.frame.size.width)

            

            var button = UIButton.buttonWithType(UIButtonType.Custom) as UIButton

            button.backgroundColor = .grayColor()

            button.frame = CGRectMake(xLoca, 0, self.view.frame.size.width, 200)

            button.setTitleColor(UIColor.whiteColor(), forState:.Normal)

            button.setTitle("点击按钮", forState: UIControlState.Normal)

            button.titleLabel!.font = UIFont.boldSystemFontOfSize(CGFloat(25))

            button.setImage(UIImage(named:""), forState: UIControlState.Normal)

            button.contentMode = UIViewContentMode.ScaleAspectFit

            scroll!.addSubview(button)

                        

        }

        

        scroll?.contentSize = CGSizeMake(5*self.view.frame.size.width, 200)

        scroll?.setContentOffset(CGPointMake(0, 0), animated: true)

  

        pageControl = UIPageControl(frame: CGRectMake(0, 320, self.view.frame.size.width,40))

        pageControl?.backgroundColor = UIColor.clearColor()

        pageControl?.numberOfPages = 5

        pageControl?.currentPage = 0

        pageControl?.pageIndicatorTintColor = UIColor.blackColor()

        pageControl?.currentPageIndicatorTintColor = UIColor.redColor()

        pageControl?.userInteractionEnabled = false

        self.view.addSubview(pageControl!)

        

    }

    

    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {

        var index = Int(scrollView.contentOffset.x/scrollView.frame.size.width)

        pageControl?.currentPage = index

        self.title = "当前索引: \(index+1) / 5"

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }
}

2018-11-05 23:00:24 Takioo 阅读数 280

更多原创文章,请访问:https://takioo.cn

随着 Xcode9 Swift 4.0 的到来,一些小问题也接踵而至。

 

许多优秀的 Swift 第三方框架还没有来得及迎接 Swift 4.0 的到来,它们还停留在 Swift3.x 的状态。

这个时候新建一个项目,使用cocoapods 引入所需的第三方,即使 pod install 成功后,一编译工程就是满屏红,

且报错 Swift compiler Error,如下图:

不过所幸,苹果每次升级 Xcode 都会保留上个版本的 swift。

 

解决方案,控制编译时第三方框架所使用的 Swift 版本,有如下两种方法。

方法1. 在 Xcode 设置中手动为每个需要指定 swift 版本的第三方框架设置 swift 版本,如下图:

方法2. 在podfile 文件中,使用 Cocoapods 控制 :

platform :ios, '9.0'
post_install do |installer|
    # 需要指定swift编译版本的第三方的名称
    myTargets = ['Charts','Moya']
    installer.pods_project.targets.each do |target|
        if myTargets.include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '3.2'
            end
        end
    end
end

use_frameworks!

target 'xxxx' do

pod 'IQKeyboardManager', '~>4.0.6'
pod 'JSONModel'
pod 'KVOController'
pod 'MagicalRecord'
pod 'Mantle'
pod 'MJRefresh'
pod 'Masonry'
pod 'Moya'
pod 'ReactiveSwift'
pod 'SDWebImage'
pod 'SwiftyJSON'
pod 'SDCycleScrollView'
pod 'Charts', '~> 3.0.1'

end

然后再 pod install 一下就可以了。

2017-02-10 10:36:40 SuperMageHuang 阅读数 117

//计算文字高度
func heightSizeWithContent(content:String,widthSize:CGFloat,fontSize:Int) -> CGSize{
    
    let contentSize = content.boundingRect(with: CGSize(width:widthSize,
                                                        height:CGFloat(MAXFLOAT)),
                                           options:.usesLineFragmentOrigin,
                                           attributes: [NSFontAttributeName:UIFont.systemFont(ofSize: CGFloat(fontSize))],
                                           context: nil).size
    
    return contentSize
}

//剥出文字中的数字
func extractTheNumberInTheText(str:String) -> Int{
    
    var number = 0
    let scanner = Scanner.init(string: str)
    scanner.scanUpToCharacters(from: CharacterSet.decimalDigits, into: nil)
    scanner.scanInt(&number)
    
    return number
}

//正则判断手机号
func checkTelNumber(telNumber:String) -> Bool{
    
    let pattern = "^1+[3578]+\\d{9}"
    let pred = NSPredicate.init(format: "SELF MATCHES %@", pattern)
    let isMatch = pred.evaluate(with: telNumber)
    
    return isMatch
}

//判断时间差以及是否是同一天
func timeToDetermine(nowDate:Date,beforeDate:Date) -> Bool{
    
    //开始比较
    if Calendar.current.isDate(nowDate, inSameDayAs: beforeDate) {
        //它们是同一天
        
        //获取两个时间差
        let diffComponents = Calendar.current.dateComponents([Calendar.Component.hour], from: beforeDate, to: nowDate)
        
        if diffComponents.hour! >= 5 {
            return true
        }
        return false
        
    }else {
        
        //它们不是同一天
        return true
        
    }
    
}


    }

    

}

2017-11-29 10:39:00 weixin_33895475 阅读数 20
877439-340d050f35073dff.jpeg
OC-Swift.jpeg

iOS开发中,我们需要根据用户需要去适配各种各样的版本,特别是苹果爸爸的每一次新版本发布,作为开发者的我们永远是最先知道的,并且奋斗在最前线:

  • Xcode适配
  • Swift版本更新
  • iPhone适配
  • iOS系统适配

这里主要介绍一下最新版 Swift 4.0 适配,并简单的说一下关于Xcode9特性与适配的问题
关于Swift新特性可以参考这里:Swift 4.0 新特性

前言

Xcode 9 中同时集成了 Swift 3.2 和 Swift 4。

  • Swift 3.2 完全兼容 Swift 3.1,并会在过时的语法或函数上报告警告。
  • Swift 3.2 具有 Swift 4 的一些写法,但是性能不如 Swift 4。
  • Swift 3.2 和 Swift 4 可以混合编译,可以指定一部分模块用 Swift 3.2 编译,一部分用 Swift 4 编译。
  • 迁移到 Swift 4 后能获得 Swift 4 所有的新特性,并且性能比 Swift 3.2 好。

总结:

当 Xcode 正式版发布后,现有的 Swift 代码可以直接升级到 Swift 3.2 而不用做任何改动,也可以后续再迁移到 Swift 4。 或者直接迁移到 Swift 4 也可以,Swift 4 相比 Swift 3 的 API 变化还是不大的,很多第三方库都可以直接用 Swift 4 编译。 Swift 1 到 2 和 Swift 2 到 3 的迁移的痛苦在 3 到 4 的迁移上已经大大改善了。

适配

关于Swift 4适配中OC与Swift混编的坑比较多

查看当前版本

我这里已经是最新的版本:


877439-4db1f8be67c6ea02.png
Swift版本

当前环境

  • Mac OS 10.13.1
  • XCode 9.1
  • 当前Swift版本 4.0

升级版本方式

877439-c5e62393545ab4f6.png
更新Swift版本
  • 然后勾选需要转换的 target (pod 引用不用勾选),Next
  • 然后选择转换选项,Next
  • 这两个选项是关于 swift 的 @objc 推断特性的,如果使用了 swift4.0 显式的 @objc 属性,能减少整体代码的大小。此时我们选 Minimize Inference(recommend)
877439-88d7fe75b1a65745.png
updateSwiftVersinTwo.png
  • 在编译器隐式推断的任何地方向代码添加一个@objc属性。这个选项不会改变你的二进制文件的大小,因为被Swift 3隐式推断在所有的地方都添加了显式的@objc属性。
  • 根据静态推断,仅在需要的地方添加@objc属性。使用此选项后,需要按照Completing a Swift 4 minimize inference migration来完成转换。
  • Minimize Inference(recommend)
  • Match Swift 3 Behavior

升级完成后可能会运行不起来

编译不通过

如果项目中之前有class和extension,有些也给OC调用。在OC的代码中,我们通过#import "ModuleName-Swift.h"导入了Swift文件。如果是Swift3.2,一切都能正常工作,但是在Swift4.0上,编译通不过了。

如果你看了Swift 4特性的话应该知道

swift4.0 最大的特性之一就是 @objc 修饰符的变化了,它主要处理 OC 和 swift 混编时一些方法的调用以及属性获取问题,swift4.0 将在 swift3.x 中一些隐式类型推断的特性去除以后,需要我们来手动管理 @objc 修饰符。

具体解决方案:

  • 一:在OC中调用一个Swift4.0类的方法(包括实例方法、static方法、class方法),你需要:
    • 在该Swift4.0类前加上修饰符@objc
    • 该Swift4.0类必须继承NSObject(否则,无法在前面加上修饰符@objc。当然,这里指的是普通类,@objc也是可 以修饰UI开头的一系列UIKit框架下的UI类,只是修饰了这些类,不会产生什么影响)
    • 在需要调用的方法前加上修饰符@objc
  • 二:在OC中调用一个Swift4.0扩展的属性(包括实例属性、static属性、class属性)、方法(包括实例方法、static方法、class法),你有如下两种选择方式:
    • 在该Swift4.0扩展前加上修饰符@objc(这样的话,该扩展下的所有的属性、方法,都可被OC调用)。
    • 在需要的属性、方法前直接加上@objc修饰,也可达到目的。

注意一点:swift3 使用 #selector 指定的方法,只有当方法权限为 private 时需要加 @objc 修饰符,swift4.0 都要加 @objc 修饰符 swift4.0 不再允许重载 extension 中的方法(包括instance、static、class方法)

运行时找不到属性

如果你有一个Swift类继承自UIViewController,OC中调用或者操作这个类[viewController valueForKey:@"userName"]这一KVC方法去获取这个自定义UIViewController中的userName这一属性的属性值。

这种方式,编译时是无法检查出问题的。但是在运行时,问题就来了,找不到这个属性。因为这个属性没有暴露给OC来进行调用。

解决方案:

  • 仅需要在自定义的UIViewController类中给需要暴露给OC调用的属性前加上@objc修饰符便可。如此一来,在OC代码中就能访问到这个属性。

(注意:这里可不像上面提到的extension一样,在这个已定义的UIViewController类前面加上@objc修饰符没有任何意义)。

编译警告

运行时警告会打印在控制台:

***Swift runtime: 
ClassName.swift:lineInFile:columnInLine: 
entrypoint -[ClassName methodName] generated by implicit @objc inference is deprecated and will be removed in Swift 4; 
add explicit @objc to the declaration to emit the Objective-C entrypoint in Swift 4 and suppress this message

同样:想要修复运行时警告,需要添加 @objc 修饰符到对应的方法或者符号。

运行时警告的常见原因:

  • 在 OC 中使用 SEL
  • 在 swift 中使用了 perform methods
  • 在 OC 中使用了 performSelector methods
  • 使用了 @IBOutlet 或者 @IBAction

其他修改

NSAttributedStringKey

swift3.x
public init(string str: String, attributes attrs: [AnyHashable : Any]? = nil)

swift4.0
public init(string str: String, attributes attrs: [NSAttributedStringKey : Any]? = nil)

String

废弃characters

swift 3
var count = string.characters.count

error
'characters' is deprecated: Please use String or Substring directly

swift 4
count = string.count

废弃addingPercentEscapes

swift 3
var url = @"http://www.example.com?username=姓名"
url = url.addingPercentEscapes(using: String.Encoding.utf8)!

error
'addingPercentEscapes(using:)' is unavailable: Use addingPercentEncoding(withAllowedCharacters:) instead, which always uses the recommended UTF-8 encoding, and which encodes for a specific URL component or subcomponent since each URL component or subcomponent has different rules for what characters are valid.

swift 4
uri = uri.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!

废弃substring(to:)

swift 3
let index = tagText.index(tagText.startIndex, offsetBy: MPMultipleStyleListItemTagMaxLength)

// 警告:'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range upto' operator.
let b = tagText.substring(to: index)

Swift 4
let a = tagText.prefix(upTo: index) //a 的类型是 Substring,不是 String

pod 引用

添加以下内容到 Podfile

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if ['WTCarouselFlowLayout', 'XSLRevenue', 'OHHTTPStubs/Swift'].include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '3.2'
            end
        end
    end
end

系统方法

UITableViewDelegate 协议方法名变更,没有错误提示:

// swift3.x
func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: IndexPath) -> CGFloat 

// swift4.0
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

总结

Swift3.2到Swift4.0的改变:

  • Swift4.0中对于扩展的属性(包括实例属性、static属性、class属性),都只能使用get方法,不可使用set方法

  • Swift4.0中不再允许复写扩展中的方法(包括实例方法、static方法、class方法)

  • 编译期与运行时警告处理,添加 @objc 修饰符到对应的方法或者符号。

  • swift3使用#selector指定的方法,只有当方法权限为private时需要加@objc修饰符,现在全都要加@objc修饰符

  • 字体方面的一些重命名:

    • NSFontAttributeName重命名为NSAttributedStringKey.font
    • NSForegroundColorAttributeName重命名为NSAttributedStringKey.foregroundColor
    • NSStrikethroughStyleAttributeName重命名为NSAttributedStringKey.strikethroughStyle

sublime开发swift

阅读数 38

swift 开发库

阅读数 222

没有更多推荐了,返回首页