4.0指针使用 swift_强指针和弱指针 m.blog.csdn.net - CSDN
精华内容
参与话题
  • 升级Swift4.0遇到的坑

    万次阅读 2017-09-12 19:36:19
    升级Swift4.0 并不是所有库都能做到及时支持Swift4.0,更何况是在现在连Xcode9也还是beta的状态 所以我们仅能做到将自己的业务代码(主工程代码)部分升级到Swift4.0,然后同时保留各种pod库在Swift3.2版本。 没...

    升级Swift4.0

    • 并不是所有库都能做到及时支持Swift4.0,更何况是在现在连Xcode9也还是beta的状态
    • 所以我们仅能做到将自己的业务代码(主工程代码)部分升级到Swift4.0,然后同时保留各种pod库在Swift3.2版本。
    • 没办法,谁叫Swift4.0也还无法做到API兼容呢(但愿能在Swift5之前实现吧)。
    • 至于我说的同时使用两个版本的Swift,这是没问题的,Xcode9支持在项目中同时使用Swift3.2和Swift4.0。

    一. 修改Swift版本

    1. 如下图指定主工程的Swift版本为4.0

    Xcode图示.png
    Xcode图示.png

    2. 修改pod库

    • 在Podfile文件的最下方加入如下代码,指定pod库的Swift版本为3.2(这样会使得所有的第三方pod库的Swift版本都为3.2)
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['SWIFT_VERSION'] = '3.2'
        end 
      end
    end
    

    二. 主工程中的代码修改

    1. 列举一下Swift3.2到Swift4.0的改变(只是我项目中遇到的):

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

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

      • 比如:自定义的协议方法在extension中实现,若某个类遵循了该协议,其子类便不能重写该协议方法
      • 解决的方法是: 在每个需要该协议的类里面都重新遵循该协议,实现协议方法
      • 个人想到的办法,不知道有没有其他解决办法可以提供一下
    • 3). swift3使用#selector指定的方法,只有当方法权限为private时需要加@objc修饰符,现在Swift4.0全都要加@objc修饰符

    • 4). 自定义的protocol协议中,有optional修饰的非必须实现的方法,需要用@objc修饰

    • 5). 字体方面的一些重命名

    NSFontAttributeName --- .font 
    //或者NSAttributedStringKey.font
    
    NSForegroundColorAttributeName --- .foregroundColor
    //NSAttributedStringKey.foregroundColor
    
    NSStrikethroughStyleAttributeName --- .strikethroughStyle
    //NSAttributedStringKey.strikethroughStyle
    
    //字符串类型的,添加rawValue
    NSAttributedStringKey.font.rawValue
    
    //等等等等..........
    
    //大部分类似以下,涉及富文本的方法均已改为了NSAttributedStringKey类型
    addAttributes(_ attrs: [NSAttributedStringKey : Any] = [:], range: NSRange)
    

    三. 项目中遇到的一些的报错问题

    3-1. "Closure cannot implicitly capture a mutating self parameter"错误

    在struct中,如果我们在闭包中使用self,就会得到Closure cannot implicitly capture a mutating self parameter的错误提示。比如:

    
    struct RecordModel {
        /// 定义一个闭包
        var action: (() -> ())?
        var height = 10
        
        self.action = { 
            self.height = 20 
            //Closure cannot implicitly capture a mutating self parameter报错
        }
    }
    
    ++并且由于RecordModel的类型是struct,我们也没发在action闭包里添加截获列表。那么是不是就必须使用class了?答案是否定的。有两种方式可以解决这个问题。++

    方案一:为closure增加一个inout类型的参数

    
    struct RecordModel {
        /// 定义一个闭包
        var action: ((_ inSelf: inout RecordModel) -> ())?
        var height = 10
        
        self.action = { (inSelf) in
            inSelf.height = 20 
        }
    }
    
    
    根据inout类型的说明,我们知道,实际上这相当于增加了一个隐藏的临时变量,self被复制,然后在closure(闭包)中使用,完成后,再复制回self。也就是说,这个方法有额外的内存开销。如果是struct较大的情形,这么做并不划算。

    方案二:使用UnsafeMutablePointer<Pointee>

    • ==这次采用直接指针的方式对于struct来进行操作,采用指针的好处是self不会被多次复制,性能较高。缺点是你需要自行确定你的代码的安全。==
    
    struct RecordModel {
        /// 定义一个闭包
        var action: (() -> ())?
        var height = 10
        
        let selfPointer = UnsafeMutablePointer(&self)
        self.action = { 
            selfPointer.pointee.height = 20 
            
        }
    }
    
    

    结论

    ==Closure cannot implicitly capture a mutating self parameter错误的原因是在进出closure(闭包)之后,self的一致性没办法得到保证,所以编译器默认不允许在struct的closure(闭包)中使用self。如果我们确定这么做是安全的,就可以通过上面的两种方式解决这个问题。其中,方法二的性能更好一些。==

    注意

    这里可以记一下指针和swift变量之间的关系:

    • UnsafePointer对应let
    • UnsafeMutablePointer对应var
    • AutoreleasingUnsafeMutablePointer对应unowned UnsafeMutablePointer,用于inout的参数类型
    • UnsafeRawPointer对应let Any,raw系列都是对应相应的Any类型
    • UnsafeBufferPointer是non-owning的类型(unowned),用于collection的elements, buffer系列均如此

    3-2. Declarations from extensions cannot be overridden yet 错误

    ==这个错误大致是因为,协议方法是在extension里面的,不能被重写==

    解决办法:(仅供参考,如有更好的建议还望多多指教)

    • 小编想到的解决办法就是在每一个需要此协议的类里面,重新遵循代理,实现该协议方法

    3-3. "Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift"

    ==报错原因: 在于已经废弃的initialize方法,示例如下==

    • 方法交叉(Method Swizzling)
      • 有时为了方便,也有可能是解决某些框架内的 bug,或者别无他法时,需要修改一个已经存在类的方法的行为。方法交叉可以让你交换两个方法的实现,相当于是用你写的方法来重载原有方法,并且还能够是原有方法的行为保持不变。
    extension UIViewController {
        public override class func initialize() {//此处报错
            
        //此处省略100行代码
            
        }
    }
    
    
    • initialize该方法已经被Swift4.0废弃
    • 在Swift3.0还勉强可以使用,但是会有警告;但是在4.0已经被完全废弃

    ==替代方法:==

    • 在 app delegate 中实现方法交叉
    • 像上面通过类扩展进行方法交叉,而是简单地在 app delegate 的 application(_:didFinishLaunchingWithOptions:) 方法调用时调用该方法
    extension UIViewController {
        public override class func initializeOnceMethod() {
            
        //此处省略100行代码
            
        }
    }
    
    //在AppDelegate的方法中调用:
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
        //此处省略100行代码
        UIViewController.initializeOnceMethod()
    
    }
    

    3-4. 'dispatch_once' is unavailable in Swift: Use lazily initialized globals instead

    报错原因: dispatch_once在Swift4.0也已经被废弃

    extension UITableView {
        struct once{
            static var onceTaken:Int = 0
        }
        dispatch_once(&once.onceTaken) { () -> Void in
        //在这里dispatch_once就会报错
            //此处省略1000000行代码    
        }
    }
    

    解决方法: 通过给DispatchQueue添加扩展实现

    extension DispatchQueue {
        private static var _onceTracker = [String]()
        public class func once(token: String, block: () -> ()) {
            objc_sync_enter(self)
            defer {
                objc_sync_exit(self)
            }
            if _onceTracker.contains(token) {
                return
            }
            _onceTracker.append(token)
            block()
        }
        
        func async(block: @escaping ()->()) {
            self.async(execute: block)
        }
        
        func after(time: DispatchTime, block: @escaping ()->()) {
            self.asyncAfter(deadline: time, execute: block)
        }
    }
    
    

    使用字符串token作为once的ID,执行once的时候加了一个锁,避免多线程下的token判断不准确的问题。
    使用的时候可以传token

     DispatchQueue.once(token: "tableViewOnce") {
         print( "Do This Once!" )  
     }
    

    或者使用UUID也可以:

    private let _onceToken = NSUUID().uuidString
      
    DispatchQueue.once(token: _onceToken) {  
        print( "Do This Once!" )  
    }
    
    • 后续又遇到别的问题会继续更新
    • 文章中如有解释不足之处,还望多多指教
    展开全文
  • swift 对象储存地址分析

    千次阅读 2018-01-31 15:20:59
    前言:  开始学swift,大家不知道有没有我这个疑问,现在用let var 来给常量变量赋值,那么以前OC那些属性修饰符在swift 是怎么用呢?  swift let var 是strong 强引用 ...swift4.0打印内存地址的方法是: Unman
    前言:
     开始学swift,大家不知道有没有我这个疑问,现在用let var 来给常量变量赋值,那么以前OC那些属性修饰符在swift 是怎么用呢?
     swift let var 是strong 强引用 是weak 弱引用 还是copy 呢。带着这个问题,测试分析一波。

    测试打印程序

    先定义一个打印对象地址方法:

    swift4.0打印内存地址的方法是: Unmanaged.passUnretained(obj).toOpaque()

    swift语言还在改动中,目前已经趋于稳定,4之前的打印地址内存地址方法:%p ,unsafeaddressof 都以无效。

    //定义方法打印对象内存地址
    func printAddress(values:AnyObject...){
        for value in values {
            print(Unmanaged.passUnretained(value).toOpaque())
        }
        print("-----------------------------------------")
    }

    验证测试:先看看这个打印方法是不是打印内存地址,而不是指针地址。制作一个单例,然后看看是否使用一块内存。

    final class Single:NSObject {
        static let sharedManger = Single()
        private override init(){
        
        }
    }
    var  sing1 = Single.sharedManger
    var  sing2 = Single.sharedManger
    var  sing3 = Single.sharedManger
    printAddress(values: sing1 as AnyObject,sing2 as AnyObject,sing3 as AnyObject)

    打印结果:


    step1 :先测试下基本类型 int (float,doule一致)

    直接看程序分析结果:

    var a1 = 5
    let b1 = a1
    a1=8
    print(a1,b1)
    printAddress(values: a1 as AnyObject,b1 as AnyObject)
    
    let a2 = 5
    let b2 = a2
    print(a2,b2)
    printAddress(values: a2 as AnyObject,b2 as AnyObject)
    
    var a = 5
    var b = a
    a=8
    print(a,b)
    printAddress(values: a as AnyObject,b as AnyObject)

    打印结果:

        

    step2 :字符串:string 和nsstring

    //string
    var str = "hello"
    var str1 = str
    str = "world"
    str1
    printAddress(values: str as AnyObject,str1 as AnyObject)
    
    //nsssting
    var nsstr = NSString.init(string:"6666")
    var nsstr1 = nsstr
    nsstr = "ssss"
    nsstr1
    printAddress(values: nsstr as AnyObject,nsstr1 as AnyObject)

    step3:数组、字典、结构体:

    //数组
    var array  = ["1","2","3"]
    var array1 = array
    array.remove(at: 2)
    print(array.description+"---"+array1.description)
    printAddress(values: array as AnyObject,array1 as AnyObject)
    
    //结构体
    var  my  =  myStruct()
    var  my1 =  my
    my.height = 5
    print(my1.height)

    step4:类对象

    class ReferenceObj:NSObject,NSCopying{
        func copy(with zone: NSZone? = nil) -> Any {
            let copyobj = ReferenceObj()
            return copyobj;
        }
        
        var name:String = ""
        var age=0
        var friends:NSArray?
        var skill:Dictionary<String, Any>?
    }
    


    var ref  = ReferenceObj();
    ref.name = "re1"
    
    var ref1  = ref;
    print(ref.name+"\n"+ref1.name)
    
    var ref2  = ref.copy() as! ReferenceObj
    
    printAddress(values: ref as AnyObject,ref1 as AnyObject,ref2 as AnyObject)


    分析结果:

          以上类型除了let 赋值let的时候和类对象赋值默认赋值情况下是引用,没有对内存地址进行拷贝。其他情况都会进行地址拷贝。如果类对象进行地址拷贝和oc一样遵循NSCopying协议,对象执行copy方法即可拷贝地址。




    展开全文
  • Swift4.0 新特性----字符串改进

    万次阅读 2019-09-22 21:25:26
    注:文章转自这里 1.Unicode 字符串在计算 count 时的正确性改善 在 Unicode 中,有些字符是由几个其它字符组成的,比如 é 这个字符,它可以用 \u{E9} 来表示,也可以用 e 字符和上面一撇字符组合在一起表示 \u...

    注:文章转自这里

    1.Unicode 字符串在计算 count 时的正确性改善

     

    在 Unicode 中,有些字符是由几个其它字符组成的,比如 é 这个字符,它可以用 \u{E9} 来表示,也可以用 e 字符和上面一撇字符组合在一起表示 \u{65}\u{301}。

    看以下代码:

    var family = "x"
    family += "\u{200D}x"
    family += "\u{200D}x" 
    family += "\u{200D}x"
    print(family)
    print(family.characters.count)

     

    这个 family 是一个由多个字符组合成的字符,打印出来的结果是一个特殊的emoji表情。上面的代码在 Swift 3 中打印的 count 数是 4,在 Swift 4 中打印出的 count 是 1。


    2.更快的字符处理速度

     

    Swift 4 的字符串优化了底层实现,对于英语、法语、德语、西班牙语的处理速度提高了 3.5 倍。

    对于简体中文、日语的处理速度提高了 2.5 倍。(数据来源于官方PPT)
     

    3.去掉 characters

     

    Swift 3 中的 String 需要通过 characters 去调用的属性方法,在 Swift 4 中可以通过 String 对象本身直接调用,例如:

    let values = "one,two,three..."
    var i = values.characters.startIndex
    while let comma = values.characters[i...<values.characters.endIndex].index(of: ",") {
        if values.characters[i..<comma] == "two" {
            print("found it!")
        }
        i = values.characters.index(after: comma)
    }



    Swift 4 可以把上面代码中的所有的 characters 都去掉,修改如下:

    let values = "one,two,three..."
    var i = values.startIndex
    while let comma = values[i...<values.endIndex].index(of: ",") {
        if values[i..<comma] == "two" {
            print("found it!")
        }
        i = values.index(after: comma)
    }
    


     

    4.One-sided Slicing

     

    Swift 4 新增了一个语法糖 ... 可以对字符串进行单侧边界取子串。

    Swift 3:

    let values = "abcdefg"
    let startSlicingIndex = values.index(values.startIndex, offsetBy: 3)
    let subvalues = values[startSlicingIndex..<values.endIndex]


    Swift 4:

    let values = "abcdefg"
    let startSlicingIndex = values.index(values.startIndex, offsetBy: 3)
    let subvalues = values[startSlicingIndex...] // One-sided Slicing
    
    let newStr = String(str[..<index]) // = str.substring(to: index) In Swift 3
    let newStr = String(str[index...]) // = str.substring(from: index) In Swif 3
    let newStr = String(str[range]) // = str.substring(with: range) In Swift 3


     

    5.String 当做 Collection 来用

     

    Swift 4 中 String 可以当做 Collection 来用,并不是因为 String 实现了 Collection 协议,而是 String 本身增加了很多 Collection 协议中的方法,使得 String 在使用时看上去就是个 Collection。例如:
    翻转字符串:

    let abc: String = "abc"
    print(String(abc.reversed()))
    // cba



    遍历字符:

    let abc: String = "abc"
    for c in abc {
        print(c)
    }
    /*
    a
    b
    c
    */



    Map、Filter、Reduce:

    // map
    let abc: String = "abc"
    _ = abc.map {
        print($0.description)
    }
    // filter
    let filtered = abc.filter { $0 == "b" }
    // reduce
    let result = abc.reduce("1") { (result, c) -> String in
        print(result)
        print(c)
        return result + String(c)
    }
    print(result)


     


    6.Substring

    在 Swift 中,String 的背后有个 Owner Object 来跟踪和管理这个 String,String 对象在内存中的存储由内存起始地址、字符数、指向 Owner Object 指针组成。Owner Object 指针指向 Owner Object 对象,Owner Object 对象持有 String Buffer。当对 String 做取子字符串操作时,子字符串的 Owner Object 指针会和原字符串指向同一个对象,因此子字符串的 Owner Object 会持有原 String 的 Buffer。当原字符串销毁时,由于原字符串的 Buffer 被子字符串的 Owner Object 持有了,原字符串 Buffer 并不会释放,造成极大的内存浪费。


    在 Swift 4 中,做取子串操作的结果是一个 Substring 类型,它无法直接赋值给需要 String 类型的地方。必须用 String() 包一层,系统会通过复制创建出一个新的字符串对象,这样原字符串在销毁时,原字符串的 Buffer 就可以完全释放了。

    let big = downloadHugeString()
    let small = extractTinyString(from: big)
    mainView.titleLabel.text = small // Swift 4 编译报错
    mainView.titleLabel.text = String(small) // 编译通过

     

     

    7.多行字符串字面量

     

    Swift 3 中写很长的字符串只能写在一行。

    func tellJoke(name: String, character: Character) {
        let punchline = name.filter { $0 != character }
        let n = name.count - punchline.count
        let joke = "Q: Why does \(name) have \(n) \(character)'s in their name?\nA: I don't know, why does \(name) have \(n) \(character)'s in their name?\nQ: Because otherwise they'd be called \(punchline)."
        print(joke)
    }
    tellJoke(name: "Edward Woodward", character: "d")


    字符串中间有换行只能通过添加 \n 字符来代表换行。

    Swift 4 可以把字符串写在一对 """ 中,这样字符串就可以写成多行。

    func tellJoke(name: String, character: Character) {
        let punchline = name.filter { $0 != character }
        let n = name.count - punchline.count
        let joke = """
            Q: Why does \(name) have \(n) \(character)'s in their name?
            A: I don't know, why does \(name) have \(n) \(character)'s in their name?
            Q: Because otherwise they'd be called \(punchline).
            """
        print(joke)
    }
    tellJoke(name: "Edward Woodward", character: "d")

     

    展开全文
  • [swift]4.0原生字符串

    千次阅读 2017-03-05 15:40:42
    swift4.0原生字符串

    4.1字符
    1.格式: 变量关键字和常量关键字
    变量 : Character = 字符值。
    注意点:字符值 必须用双引号括起来, 必须是一个字符。
    例:
    var ch :Character = “c”// 字符值 必须用双引号,并且是一个字符
    println(“ch=(ch)”)
    运行结果
    ch=c
    2.字符串和字符的关系:
    字符串是由N个字符组成的,即字符串是字符的集合。
    例:
    var str = “ABC”//字符串
    “ABC” 是有 三个字符组成的分别是 :字符”A”,字符“B”,字符”C”
    4.2创建字符串
    1.Swift支持String字符串类型和Charater字符类型来提供一个快速的、支持Unicode编码的方式来处理字符操作。
    Swift的String类型和Objective-C的NSString无缝接合,所有NSString的API对String同样适用。但是String变量总是可变长的,而在Objective-C中变长字符串是NSMutableString。
    2.Swift字符串是传值类型,在传入函数参数或者赋值时,它是新建一个原来字符串的拷贝,而不是分配一个指针,新建字符串和原来的字符串并不储存在同一个空间。区别于Objective-C中NSString,后者是传址类型,即相当于一个指针。
    Character字符类型同样用双引号把字符括起来,每一个字符代表一个独立的Unicode字符,字符串相当于Character的一个集合。
    字符串和字符之间可以两两连接,使用最简单的运算符
    +,+=同样适用。
    3.创建空字符串
    /定义一个空字符串第一种方法:
    var str1=”“定义一个空字符串
    第二种方法:
    var str2 = String()
    运行结果
    str1=
    str2=
    4.判断字符串是否为空 (isEmpty)
    判断字符串是否为空:
    var str3:String = “”if str3.isEmpty { //isEmpty是字符串的一个属性,判断字符串是否为空
    println(“str3的值是空”)
    }
    else{
    println(“str3的值不为空”)
    }

    运行结果
    str3的值是空
    5.字符串的转义符
    \0 空字符 \ 反斜杠\ t 制表符\n 换行符\r 回车符
    \” 双引号\’ 单引号
    例:
    换行符:
    var strA = “Hello World \n 1”// \n是换行符
    println(“strA=(strA)”)
    引号:
    var strB = “\”双引号”// \” 是代表双引号
    println(“strB=(strB)”)
    单引号:
    var strC = “\’单引号”// \’ 代表单引号
    println(“strC=(strC)”)
    运行结果
    strA=Hello World
    1
    strB=”双引号
    strC=’单引号
    4.3字符串拼接
    1.字符和字符串拼接,用+直接来拼接,组成新的字符串 (和字符串拼接用法一直)
    例:import Foundation
    var C:Character = “S”//定义C 是字符变量var str = C + ” hello”
    println(str )
    运行结果
    S hello
    2.字符串变量和常量用+或 +=来拼接 组成新的字符串
    例:
    多个字符串变量拼接 用 + 来拼接
    var str4 = “hello”
    var str5 = ” swift”
    var str6 = str4+str5 //字符串变量拼接
    println(“str6=(str6)”)
    字符串变量和常量用+或 +=来拼接
    var str7=”hello ”
    str7 += “swift”//字符串变量和字符常量拼接可以用+= 拼接
    println(“str7=(str7)”)
    运行结果
    str6=hello swift
    str7=hello swift
    4.字符串和占位变量 组成新的字符串
    var a = 3//定义一个整形变量
    var strQ = “a = (a)”// 字符串和占外变量,组成新的变量(占外变量表示(变量))
    println(“(strQ)”)
    运行结果
    a = 3
    4.4字符串插入、删除和替换
    1.对应可变字符串可以插入、删除和替换,String提供了几个方法可以帮助实现这些操作。这些方法如下:
    splice(_:atIndex:)。在索引位置插入字符串。
    insert(_:atIndex:)。在索引位置插入字符。
    removeAtIndex(_:)。在索引位置删除字符。
    removeRange(_:)。删除指定范围内的字符串。
    replaceRange(_:,with: String) 。使用字符串或字符替换指定范围内的字符串。
      代码:
    var str =”Swift” print(“原始字符串:(str)”)
    str.splice(“Objective-Cand “.characters, atIndex: str.startIndex)
    str.insert(“.”,atIndex: str.endIndex)
    str.removeAtIndex(str.endIndex.predecessor())
    var startIndex =str.startIndex
    var range =startIndex…endIndex
    str.removeRange(range)
    startIndex =str.startIndex
    str.replaceRange(range,with: “C++”)
    print(“替换范围后:(str)”)
    输出结果:
    原始字符串:Swift
    插入字符串后:Objective-C and Swift
    插入.字符后:Objective-Cand Swift.
    删除.字符后:Objective-Cand Swift
    删除范围后:C and Swift
    替换范围后:C++ and Swift
    4.5字符串比较
    1.字符串比较:OC:
    NSString *str1 = @”abc”;
    NSString *str2 = @”abc”;
    if ([str1 compare:str2] == NSOrderedSame)
    else { NSLog(@”不相等”); }
    { NSLog(@”相等”); }
    else { NSLog(@”不相等”); }
    Swift:(== / != / >= / <=), 和C语言的strcmp一样是逐个比较
    var str4 = “abc”;
    var str5 = “abc”;
    if str4 == str5 { print(“相等”); }
    else { print(“不相等”); }
    var str6 = “abd”;
    var str7 = “abc”;
    else { print(“不大于等于”); }
    4.6大小和相等比较
    字符串比较可以分为:不区分大小写比较、区分大小写比较以及本地化比较三部分。首先我们来看不区分大小写比较,不区分大小写比较顾名思义就是不区分字符串中字母的大小写,即A和a相同。
    1.不区分大小写比较
    在NSString中使用caseInsensitiveCompare(_:)方法实现这一功能,其语法形式如下:
    func caseInsensitiveCompare(_ string: String) -> ComparisonResult
    其中,string用来指定一个比较的字符串。该方法的返回值为ComparisonResult类型
    。ComparisonResult是一个枚举类型,包含了以下3个成员:
    q orderedAscending(-1):左操作数小于右操作数。
    q orderedSame(0):两个操作数相等。
    q orderedDescending(1):左操作数大于右操作数。
    2.区分大小写比较
    有不区分大小写比较,相对的就有区分大小写比较。在NSString中提供了4种方法实现了这种比较,
    分别为:compare(:)、compare(:options:)、compare(:options:range:)和compare(:options:range:locale:)方法。
    (1)compare(_:)方法就是用来比较字符串的,它需要区分字符串的大小写,其语法形式如下:
    func compare(_ string: String) -> ComparisonResult
    其中,string用来指定一个比较的字符串。
    compare(:options:)方法和compare(:)方法实现的功能类似,它是对字符串进行比较,但是它比compare(_:)方法多了一个mask参数。该参数可以用来指定一个选项标记(这个标记可以作为字符串比较的条件)。
    在编程中,mask参数最常被设置为以下5种:
    q caseInsensitive:不区分大小写比较
    q literal:区分大小写比较
    q backwards:从字符串末尾开始搜索
    q anchored:搜索限制范围的字符串
    q numeric:按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt
    compare(_:options:)方法的语法形式如下:
    func compare(_ string: String, options mask: NSString.CompareOptions = []) -> ComparisonResul
    (3)compare(:options:range:)方法和compare(:options:)方法的功能类似,但是它比compare(_:options:)方法多了一个rangeOfReceiverToCompare参数,此参数可以用来对比较范围进行设置。其语法形式如下:
    func compare(_ string: String, options mask: NSString.CompareOptions = [], range rangeOfReceiverToCompare: NSRange) -> ComparisonResult
    (4)compare(:options:range:locale:)方法和compare(:options:range:)方法的功能类似,但是它比compare(_:options:range:)方法多了一个locale参数,此参数可以用来设置语言环境。其语法形式如下:
    func compare(_ string: String, options mask: NSString.CompareOptions = [], range rangeOfReceiverToCompare: NSRange, locale: AnyObject?) -> ComparisonResult
    3.本地化比较
    对于本地化比较在NSString中提供了3种方法,
    分别为:
    localizedCaseInsensitiveCompare(:)、localizedStandardCompare(:)和localizedCompare(_:)。
    (1)localizedCaseInsensitiveCompare(_:)方法为不区分大小写、本地化比较字符串,其语法形式如下:
    func localizedCompare(_ string: String) -> ComparisonResult
    其中,string用来指定一个比较的字符串。
    (2)localizedStandardCompare(_:)方法为本地化标准字符串的比较,其语法形式如下:
    func localizedStandardCompare(_ string: String) -> ComparisonResult
    其中,string用来指定一个比较的字符串。
    localizedCompare(_:)方法是区分大小写、本地化比较字符串,其语法形式如下:
    func localizedCompare(_ string: String) -> ComparisonResult
    其中,string用来指定一个比较的字符串。
    4.判断字符串
    在NSString中提供了3种对字符串判断的方法,
    分别为:hasPrefix(:)、hasSuffix(:)和isEqual(to:)方法。
    (1)hasPrefix(_:)方法用来判断字符串是否以某一指定字符串开头,其语法形式如下:
    func hasPrefix(_ str: String) -> Bool
    其中,str用来指定一个字符串。
    (2)hasSuffix(:)方法正好和hasPrefix(:)方法相反,它是用来判断字符串是否以某一指定字符串结尾的,其语法形式如下:
    func hasSuffix(_ str: String) -> Bool
    其中,str用来指定一个字符串。
    (3)isEqual(to:)方法是用来判断字符串是否相等的,其语法形式如下:
    func isEqual(to aString: String) -> Bool
    其中,aString用来指定字符串。
    4.7前缀和后缀比较
    1.前缀/后缀相等
    通过调用字符串的 hasPrefix/hasSuffix 方法来检查字符串是否拥有特定前缀/后缀。两个方法均需要以字符串作为参数传入并传出 Boolean 值。两个方法均执行基本字符串和前缀/后缀字符串之间逐个字符的比较操作。
    下面的例子以一个字符串数组表示莎士比亚话剧 罗密欧与朱丽叶 中前两场的场景位置:
    let romeoAndJuliet = [
    “Act 1 Scene 1: Verona,A public place”,
    “Act 1 Scene 2: Capulet’s mansion”,
    “Act 1 Scene 3: A room in Capulet’s mansion”,
    “Act 1 Scene 4: A street outside Capulet’s mansion”,
    “Act 1 Scene 5: The Great Hall in Capulet’s mansion”,
    “Act 2 Scene 1: Outside Capulet’s mansion”,
    “Act 2 Scene 2: Capulet’s orchard”,
    “Act 2 Scene 3: Outside Friar Lawrence’s cell”,
    “Act 2 Scene 4: A street in Verona”,
    “Act 2 Scene 5: Capulet’s mansion”,
    “Act 2 Scene 6: Friar Lawrence’s cell” ]

    展开全文
  • Swift 是苹果遵循 Apache 开源授权协议开源的一门编程语言 Swift 3 源代码不兼容旧版本,主要是因为 SE-0005 和 SE-0006 的改进,这些改进不仅影响 Standard Library APIs 命名,还会完全改变 Objective-C APIs ...
  • func swap(_ a: inout Int, _ b: inout Int) { var t = 0 t = a a = b b = t } var a = 5 var b = 6 swap(&amp;a, &amp;b) print(a, b)
  • Block块/Swift闭包介绍与使用

    万次阅读 2016-01-19 22:04:03
    Block块是随OS X v10.6和iOS 4.0一同发布并可用的功能(在这个Swift2.0都出来了的时候,不用考虑block版本是否可用的问题),其功能类似于C语言的函数。但是与C语言函数不同在于Block可以存取与之在同一个作用域的变量...
  • Swift3.0 -- 闭包的循环引用与OC的对比

    千次阅读 2017-02-14 13:55:35
    block
  • swift 框架大全--NB 转自github

    万次阅读 2016-11-03 16:47:01
    Swift从Objective-C混合的md文件中抽出(正在进行…)使用方法:根据目录关键字搜索,记得包含@,以保证搜索目录关键字的唯一性。问题反馈:请广大网友只按照目录结构(即使目录结构有问题)添加三方库,并pu
  • swift 框架大全

    万次阅读 2017-06-26 11:27:09
    版本:Swift github排名 https://github.com/trending,github搜索:https://github.com/search 主要工作说明:  1. 将Swift从Objective-C混合的md文件中抽出(正在进行…) 使用方法:根据目录关键字...
  • Swift 4.0学习之:闭包

    2018-03-14 09:56:51
    闭包 说到闭包,用法跟OC的block是一样一样的,基本格式是 { ()-&gt;() in } 通常是放到函数的实参里,举一个实际应用的例子: ...目标:创建一个scrollorView,上面有10个按钮,要求有一定的可复用性,可维护...
  • TimLiu-iOSgithub排名 ...欢迎加入QQ交流群: 594119878使用方法:根据目录关键字搜索,记得包含@,以保证搜索目录关键字的唯一性。问题反馈:请广大网友只按照目录结构(即使目录结构有问题)添加三方库,并pull requ
  • UI 下拉刷新 ...EGOTableViewPullRefresh- 最早的下拉刷新控件。...MJRefresh- 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉...具体使用看“使用方法”。 (国人写) XHRefreshContr
  • 常用的iOS第三方框架

    万次阅读 2016-09-22 13:57:28
    目录 UI 下拉刷新模糊效果AutoLayout富文本图表表相关与Tabbar 隐藏与显示HUD与Toast对话框其他UI ...网络连接图像获取网络聊天网络测试网页框架WebView与WKWebView ...Model通讯录其他库数据库
  • Swift 4.0 新特性

    千次阅读 2017-08-15 19:37:46
    WWDC 2017 带来了很多惊喜,在这次大会上,Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,虽然正式版要8月底9月初才会公布,但很多强大的新特性正吸引我们去学习它。根据大会上已经开放的新特性,先一睹为快。...
  • 转自: http://www.cnblogs.com/zyjzyj/p/6015625.html github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自github:...UI
  • swift闭包的强引用

    千次阅读 2016-01-08 17:31:41
    import UIKit class ViewController: UIViewController { // var finishedCallBack: (html: String) -> ()? var finishedCallBack: ((html: String) -> ())? override func viewDidLoad() {
  • iOS GitHub上常用第三方框架

    千次阅读 2017-04-19 15:39:12
    转载自:https://github.com/Tim9Liu9/TimLiu-iOS ...下拉刷新模糊效果AutoLayout富文本图表表相关与Tabbar隐藏与显示HUD与Toast对话框其他UI ...网络连接图像获取网络聊天网络测试网页框架WebView与WKWebView
1 2 3 4 5 ... 20
收藏数 656
精华内容 262
关键字:

4.0指针使用 swift