Swift可选类型(Optional)的介绍和使用场景

Swift —— Enum & optional Swift —— Enum & optional1. 枚举的基本用法2. 关联值3. 模式匹配3. 枚举的大小 1. 枚举的基本用法 swift 中通过 enum 关键字来声明一个枚举 enum LGEnum{ case test_one case test_two case test_three } 在 C 或者 OC中默认受整数支持,也就意味着下面的例子中: A, B, C分别默认代表 0, 1,2 typedef NS_ENUM(NSUInteger, LGEnum) 阅读详情

原文地址:
https://www.jianshu.com/p/f2e25f78f5a2

可选类型(Optional)的介绍

可选类型(Optional)是Swift新添的对象。它允许变量或常量中没有值(被设为nil),主要是为了解决对象变量或常量为空的情况。
Objective-C与Swift语言对于nil的不同理解:

  • Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound)
  • Swift中的nil:表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil)

总结为OC中的nil表示没有值,而Swift中的nil表示变量值为空。

可选类型需要在类型后面加一个问号(?)。一个典型的例子是String类有一个toInt方法,该方法会将字符串转换为Int类型。不过这里就有一个问题,字符串中可能包含非数字的字符,这时就会转换失败。如果在其他语言中,不添加错误捕捉,可能会抛出异常,而在Swift中,如果转换失败,就直接返回nil。表示没有返回Int类型的值。这里的toInt方法返回的就是一个可选类型。

var numStr:String = "123" 
var value:Int? = numStr.toInt();  //  value必须定义为可选的Int类型,否则无法成功编译  
println(value) 

不过每次使用value变量时都进行判断很麻烦,所以,Swift添加了一个用于确定可选类型变量一定有值的感叹号(!)。当对value第一次判断后,如果能确认该变量已经被赋了值,后面就可以直接在value后加感叹号使用该变量了。
如果在可选类型变量(常量)后面加感叹号,当变量(常量)为nil时,程序会中断,并在终端输出如下的信息。

fatal error: unexpectedly found nil while unwrapping an Optional value 

所以在可选变量(常量)后面加感叹号时,要确保该变量(常量)中一定有值。

注意在使用可选类型变量(常量)时,如果使用问号(?)来定义,并且单独使用这些变量和常量,后面是可以不加感叹号(!)的。但要让这些变量和常量和其他的值通过操作符进行操作,那就必须要加感叹号了。

使用场景:

1.申明可选常量或变量

let status: Int? = 1   // 申明可选Int类型的常量,初始值为1 
var defaultAddress: String? = "江苏南京"   // 申明可选String类型的变量,初始值为"江苏南京"
var student: Person? // 申明可选Person(自定义的类)的变量,初始值为nil

注意:Int?与Int不相同,Int?表示可选的Int类型,可以赋值为nil,而Int不可以赋值为nil

2.使用”!”强制解析获取可选类型的值(不建议直接使用)

var defaultAddress: String? = "江苏南京"
if defaultAddress != nil { // !=或==可以用来判断是否为nil
    print("您的地址是\(defaultAddress!)") // 使用!强制解析
} else {
    print("对不起,您不存在地址信息")
}

var student: Person?
print("学生为\(student!)") // XCode会提示运行错误,因为student初始值为nil,强制解析不行

3.使用可选绑定获取可选类型的值(建议的用法)

var defaultAddress: String? = "江苏南京"
if let address = defaultAddress { // 如果defaultAddress有值或类型转换成功,则将值赋值给address直接使用
    print("您的地址是\(address)")  // 使用address代替defaultAddress,且不需要加!强制解析
} else {
    print("对不起,您不存在地址信息")
}

4.隐式解析可选类型(用于申明时肯定有初始值,但后面可能为nil)

var mobileNumber: Int64! = 13912345678 // 第一次申明有初始值
print("您的电话号码是\(mobileNumber)") // 不需要使用!强制解析
// 打印内容:**您的电话号码是****Optional(13912345678)**
// 还是不建议直接强制解析,因为实际项目中可能中间已经对该值做了改变,若为nil则会运行错误导致APP崩溃
if let number = mobileNumber { // 建议的做法
    print("您的电话号码是\(number)")
// 打印内容:**您的电话号码是****13912345678**
} else {
    print("您没有记录电话号码")
}

5.空合运算符(用于判断变量或常量是否为nil)

// 空合运算符:a ?? b 判断a是否为nil,若a不为nil对a解封,否则返回b的值
var status: Int? // 申明可选Int类型的变量status,初始值为nil
status ?? 0 // 因为status为nil,则返回0
// ?? 即为以下if else的缩写
func testOption() -> Int {
    let status: Int? = 1
    if status == nil {
        return 0
    } else {
        return status!
    }
}

6.函数/方法返回类型为可选类型

  • 返回值为可选类型的值(如Int?、String?、(Int, String)?、[Int]?、[Int: String]?等)
func returnPossibleValue(value: Bool) -> String? { // 返回类型为可选String类型
    if value {
        return "返回类型是可选类型值" // 如果为真,返回Int类型的值1
    } else {
        return nil // 如果为假,返回nil
    }
}

let possibleValue = returnPossibleValue(value: true) // 要用可选绑定判断再使用,因为possibleValue为String?可选类型
if let value = possibleValue {
    print(value)
} else {
    print("none value")
}
  • 返回值为可选类型的类(如URL?、自定义Person?等)
class SomeClass {
    var someValue: Int
    init?(someValue: Int) { // 可失败构造器
        if someValue == 1 { return nil }
        self.someValue = someValue
    }
}

func returnPossibleClass(value: Bool) -> SomeClass? { // 返回的类实例可能为nil
    if value {
        return SomeClass(someValue: 1) // 返回的为nil
    } else {
        return SomeClass(someValue: 2) // 返回的SomeClass?实例,不为nil
    }
}
  • 返回值为可选类型的闭包(如(()-> (void))? )
func returnOptionalFunc(value: Bool) -> (() -> (Void))? { // 返回类型为可选类型的闭包
    if value {
        return { () in
            print("返回类型是可选类型闭包")
        }
    } else {
        return nil
    }
}

let possibleFunc = returnOptionalFunc(value: true) // 要用可选绑定判断再使用,因为possibleFunc 为可选类型的闭包,类型为() -> (Void)
if let aFunc = possibleFunc {
    print(aFunc())  // 注意增加()调用闭包,因为没有参数则是空括号
} else {
    print("none func")
}

7.可选类型在类或结构体中的运用

  • 可选类型在类中的运用:
class PossibleClass {
    var someValue: Int
    var possibleValue: String? // 可选存储属性,默认值为nil
    init(someValue: Int) { // 构造方法中可以不对possibleValue属性初始化
        self.someValue = someValue
    }
}

let someClass = PossibleClass(someValue: 4) // 实例化对象时不需要对possibleValue初始化,someClass实例中:someValue为4,possibleValue为nil

注意:类中所有属性都需要有默认值。属性可以在申明时赋予初始值,也可以在构造方法中赋予初始值;子类继承父类时,必须先给自身属性先初始化后再继承父类构造方法初始化。一般的,出于安全的因素,子类的属性都赋予初始值或直接定义为可选类型。

  • 可选类型在结构体中的运用
struct PossibleStruct {
    var someValue: Int
    var possibleValue: String? // 可选存储属性,默认值为nil
    // 结构体中可以自定义一个init构造器对属性初始化,也可以不自定义
}

let someStruct = PossibleStruct(someValue: 4, possibleValue: nil)

possibleValue可传String类型的值或nil

8.可选类型在构造器中的运用
概念:可失败构造器是 一个类、结构体或枚举类型的对象,在构造过程中有可能失败;这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满足某种必要的条件等。

  • 结构体的可失败构造器
struct PossibleStructInit {
    let someValue: String
    init?(someValue: String) { // 可失败构造器
        if someValue.isEmpty { return nil } // 如果实例化为空串,则返回nil(即实例化失败)
        self.someValue = someValue
    }
}

let oneStruct = PossibleStructInit(someValue: "abc") // abc不是空串,oneStruct为PossibleStructInit?可选类型
if let one = oneStruct { // 使用if let可选绑定判断
    print(one.someValue)
} else {
    print("none value")
}
// 结果打印 abc

let twoStruct = PossibleStructInit(someValue: "") // 传参为空串
if let two = twoStruct {
    print(two.someValue)
} else {
    print("none value")
}

结果打印为 none value

  • 枚举的可失败构造器
enum PossibleEnmuInit {
    case East, West, South, North // 不带原始值,带原始值也可以使用可失败构造器
    init?(director: Character) {
        switch director {
        case "E":
            self = .East
        case "W":
            self = .West
        case "S":
            self = .South
        case "N":
            self = .North
        default:
            return nil // 如果实例化时不是E/W/S/N字符,则返回nil(即实例化失败)
        }
    }
}

let oneEnmu = PossibleEnmuInit(director: "E")  // 传值E,返回PossibleEnmuInit?可选类型
if let one = oneEnmu { // 使用可选绑定判断
    print(one)
} else {
    print("none value")
}
// 结果打印 East

let twoEnmu = PossibleEnmuInit(director: "A")  // 传值A,返回PossibleEnmuInit?可选类型
if let two = twoEnmu { // 使用可选绑定判断
    print(two)
} else {
    print("none value")
}

打印结果 none value

  • 类的可失败构造器
class Product {
    let name: String
    init?(name: String) {   
        if name.isEmpty { return nil }
        self.name = name
    }
}

class CartItem: Product {
    let quantity: Int
    init?(name: String, quantity: Int) {
        if quantity < 1 { return nil } // 实例化时如果quantity小于1,则立即终止构造过程
        self.quantity = quantity
        super.init(name: name) // 如果name为空串,则立即终止构造过程
    }
}

if let twoSocks = CartItem(name: "sock", quantity: 2) {
    print("Item: \(twoSocks.name), quantity: \(twoSocks.quantity)")
}
// 打印 "Item: sock, quantity: 2”

if let zeroShirts = CartItem(name: "shirt", quantity: 0) {
    print("Item: \(zeroShirts.name), quantity: \(zeroShirts.quantity)")
} else {
    print("Unable to initialize zero shirts")
}

打印 “Unable to initialize zero shirts”

9.可选类型在可选链中的运用
概念:可选链为一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会成功;如果可选值是nil,那么调用将返回nil。多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil。

class Person { 
    var name: String
    var room: Room? // 不是每个人都买房,定义为可选类型
    init(name: String) {
        self.name = name
    }
}

class Room {
    var roomAddr: String
    var roomArea: Int
    init(roomAddr: String, roomArea: Int) {
        self.roomAddr = roomAddr
        self.roomArea = roomArea
    }
}

let xiaoming = Person(name: "xiaoming") // 此时xiaoming实例中属性:name为"xiaoming",room为nil
if let address = xiaoming.room?.roomAddr, let area = xiaoming.room?.roomArea { // 使用?可选链式调用,如果含有值则返回该值(不需要手动强制解析),如果没有值则返回nil
    print("\(xiaoming.name)的房子地址在:\(address), 面积:\(area)")
} else {
    print("\(xiaoming.name)没有房子")
}
// 打印:xiaoming没有房子

xiaoming.room = Room(roomAddr: "南京雨花台区", roomArea: 95) // 定义xiaoming实例的room属性
// 再次调用以上可选绑定,打印 xiaoming的房子地址在:南京雨花台区, 面积:95

10.可选类型在错误处理中的运用
概念:错误处理即为响应错误一级从错误中恢复的过程

  • 一般的错误处理写法(一般使用于需要对不同的返回结果较为清晰的捕捉并做相应的处理)
// 操作错误处理枚举
enum OperationError: Error {
    case ErrorOne
    case ErrorTwo(String) // 带关联值的枚举属性
    case ErrorOthers
}

// 错误处理抛出
func throwDriver(num: Int) throws {
    if num == 1 {
        throw OperationError.ErrorOne
    } else if num == 2 {
        throw OperationError.ErrorTwo("数据类型错误")
    } else {
        throw OperationError.ErrorOthers
    }
}

do {
    print("使用do-catch捕获错误")
    try throwDriver(num: 2) // 使用try尝试请求
    print("未捕获到错误")
} catch OperationError.ErrorOne { // catch去捕捉是否又throw出来的错误
    print("捕捉到错误:ErrorOne")
} catch OperationError.ErrorTwo(let message) { // 可以使用let 获取枚举关联值
    print("捕捉到错误:ErrorTwo" + message)
} catch OperationError.ErrorOthers {
    print("捕捉到错误:ErrorOthers")
}
// 打印结果如下:
// 使用do-catch捕获错误
// 捕捉到错误:ErrorTwo数据类型错误
  • 错误处理(try!)(不建议使用,可能会导致App崩溃)
let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")
// 上述语句中在执行loadImage方法时如果执行失败,使用try!来禁用错误传递,会有运行错误导致App崩溃
  • 错误处理(try?)(一般使用于不需要对错误进行过多的处理)
func someThrowingFunction() throws -> Int {
    // ...
}

let x = try? someThrowingFunction() // x可能正常返回一个Int类型的值也有可能抛出一个错误异常,使用时对x用if let可选绑定判断

11.可选类型在类型转换中的运用
类型转换在向上转型时一般不会出现失败,例如从子类向父类转型,直接用as即可
类型转换在向下转型时可能会出现失败,例如从父类向子类转型,要使用as?转型,使用时需要可选绑定后再用.值得注意的是:从Any转成Int为向下转型,Swift从安全因素考虑,会直接返回nil,所以在日常项目中若遇到从父类向子类转型时,一定要使用可选绑定,如以下代码

class SuperClass {
    // 这是一个父类
}

class SubClass: SuperClass {
    // 这是一个子类
}

let superClass = SuperClass()
if let someClass = superClass as? SubClass {
    // 如果转换成功,则用someClass使用即可
} else {
    // 转换失败
}

12.其他、调用公共库时注意API的返回值

var score: [String: Int] = ["语文": 87, "数学": 99, "英语": 61]
let removedValue = score.removeValue(forKey: "物理") // 返回nil

从以上代码中可看出,removeValue方法会返回被删除key对应的Value值,发现不存在key为“物理”,即返回nil(removedValue常量值)

Swift 学习之二十一:?和 !(详解) Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值, 也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错: 阅读详情

相关推荐

Swift 可选类型

在 Swift 中,可选类型通过在类型名称后加上一个问号(?)来表示。例如,一个可选的整数可以表示为Int?。这意味着这个整数变量可能包含一个整数值,也可能不包含任何值(即nil= nilSwift 的可选类型是一种强大的特性,它有助于创建更加健壮、可靠和安全的代码。通过使用可选类型,你可以有效地处理变量可能没有值的情况,从而提高应用程序的稳定性和性能。下一页。

lly202406的博客 210

12.Swift学习之Any、AnyObject与类型转化

Any、AnyObject Any是一个空协议集合的别名,它表示没有实现任何协议,因此它可以是任何类型,包括类实例与结构体实例。可以表示任何类型,包括函数类型。 AnyObject是一个成员为空的协议,任何对象都实现了这个协议。可以表示任何类类型的实例。 类型转化符号 is : 使用类型检查操作符...

weixin_34302561的博客 958

伪傻瓜式安装sql server2008【附带安装包】

安装各式各样的软件无疑是学习过程中…较…为烦躁的一部分 木有醋 但还是开始吧 为什么这是伪呢? 因为刚开始天真无邪的我真的是傻瓜式安装(迷之自信),结果就B了(打开配置管理器的瞬间….一片空白) BaiduCloud分享 红领巾在何方?? Link链接:https://pan.baidu.com/s/1NZCxP0Y27dBPrgHoRWLDyQ...

EuniBoom的博客 6万+

swift (一) option理解

option概念 之前一直对option的概念很感兴趣,苹果公司用option来包括一切,任何语言都会因为数据的匹配读取为空或者不匹配而产生一系列的问题,很显然,苹果公司有想利用option来弥补这种漏洞的野心。 option真正是什么,如果他包裹了一个数据,那么他如果其实真正是什么他就不会去关心,而是很完整的告诉下一个执行,哦,我给你的是一个option的类型,具体的话,你自己想要知道,就自己去

kivenhehaoyu的专栏 1539

ubuntu18.04美化主题(完整版)

和网上的美化一样,但是我当初跟着博客美化的时候遇到一些问题,按博客的做法无法解决。 所以我自己也写一篇关于ubuntu18.04美化主题的博客。 第一步:安装主题工具:GNOME Tweaks sudo apt-get update sudo apt-get install gnome-tweak-tool 然后安装完成后我们打开Tweaks(截图如下): 第二步,修改窗口按钮位...

B丶atty的博客 7万+

Dify插件离线部署全攻略:从下载到安装的完整流程

本文详细介绍了Dify插件离线部署的完整流程,针对企业内网等无网络环境需求。核心步骤包括在联网环境下载插件包、在特定Python 3.12.9环境下使用专用工具进行离线重打包,以及最终在离线Dify环境中安装验证。重点解决了离线安装的核心难题,并提供了环境配置、批量处理和故障排查等实用技巧,帮助用户实现Dify插件的顺利离线部署。

seed的博客 656

Swift中的可选类型与强制解包:如何安全地处理空值情况?

在Swift中,这个问题得到了很好的解决,通过引入可选类型(Optional Types)和强制解包(Forced Unwrapping)这两个概念,我们可以更加安全、有效地处理空值。在Swift中,所有的类型都有一个对应的可选类型版本,包括所有的基本数据类型(如Int、Float、Double、Bool等)和自定义类型(如类、结构体、枚举等)。因此,在编程时,我们应该尽可能地避免创建不必要的可选类型,并在可能的情况下使用更安全的方式来处理空值情况。如果可选类型是nil,那么在解包时会引发运行时错误。

derickForster的博客 1668

ROS2中间件选型指南:FastDDS与CycloneDDS零拷贝机制对比与实战

在机器人开发中,通信中间件是连接分布式节点的核心纽带,其性能直接影响系统的实时性与可靠性。DDS作为ROS2默认的通信标准,通过发布订阅模型和QoS策略,为高频大带宽场景提供了灵活的数据分发能力。并行计算与高性能传输的需求,推动了零拷贝技术的演进——从传统序列化到共享内存乃至指针传递,旨在减少数据复制开销、降低延迟。在激光雷达点云、相机图像等场景下,中间件的选型尤为关键。FastDDS凭借与ROS2的深度集成和丰富文档成为入门首选,而CycloneDDS在低延迟和资源占用上表现更优,借助iceoryx实现了

weixin_28726391的博客 251

【scala】Option类型详解

scala中的Option操作

weixin_44441131的博客 2912

ESP32S3学习——i2c,点亮0.96寸oled

ESP32S3学习——i2c,点亮0.96寸oled

HandBAI的博客 1万+

模拟量输入功能块 S_ITR(Easy系列PLC完整ST源代码)

IN Input INT 输入数字量 1IN ISH INT 输入数字量上限 2IN ISL INT 输入数字量下限 3IN OSH REAL 输出工程量上限 4IN OSL REAL 输出工程量下限 5OUT OUTPUT REAL 输出工程量 6VAR temp1 REAL 临时变量1 7VAR temp2 REAL 临时变量2 8。

RXXW_Dor的博客 716

用一个例子告诉你 什么是scala中的Option类型

用一个🌰告诉你 什么是scala中的Option类型

向热爱自己一样,热爱这个世界。 501

深度解析机器人关节位置环控制:从理论到实践

本文系统阐述了机器人关节位置环控制的核心原理与实现方法。首先介绍了关节控制的基础框架,阐明位置环在闭环控制中的关键作用。随后深入解析PID控制算法原理,包括比例、积分、微分项的功能与参数整定原则。在软件实现部分,提供了模块化设计思路和Python伪代码示例,强调实时性保障和异常处理机制。文章还包含典型面试问题解答和应用案例,展示如何通过参数优化将定位精度提升20倍。最后指出未来发展趋势将聚焦算法自适应性和系统稳健性。全文兼顾理论深度与实践指导,为开发者提供从基础到进阶的完整技术路线图。

郑伟强dev的专栏 50

Optional(可选项)使用详情

1.为什么需要Optional 1.OC里的nil是无类型的指针; 2.OC里面的数组,字典,集合等不允许放入nil; 3.OC所有对象变量都可以为nil; 4.OC只能用在对象上,而在其他地方又用其他特殊值(例如NSNotFound)表示值得缺失; 5.在swift中通过在变量类型后面加?表示这里有一个值,他等于X或者这里根本就没有值; 6.你可以通过给可选变量赋值一个nil来将之设置为没有值; 7.在OC中nil是一个指向不存在对象的指针; 8.在swift中,nil不是指针,他是值缺失的一种特殊类型

eastWind1101的博客 1590

【SpringCloud】5、Spring Cloud Gateway网关路由规则

Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。

JACKAL 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Swift中的可选类型(Optional)

为什么80%的码农都做不了架构师?>>> ...

weixin_34235371的博客 156

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Swift进阶核心】:Optional背后的设计哲学与实战优化技巧

掌握Swift可选类型用法,有效避免空值异常。深入解析Optional设计哲学,涵盖安全解包、绑定与错误处理等实战技巧,提升代码稳定性与可读性。适用于接口解析、状态判断等场景,Swift进阶必学,值得收藏。

StepNexus的博客 1051

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

swift枚举(三)-Optional

可选值 自定义Optional 替代模式匹配 if let/guard let 可选链 swift.模拟OC向一个nil发送消息 可选链也适用于下标和函数调用 运算符重载 隐士解析可选类型应用 可选值高阶函数map flatMap 及 Sequence - compactMap

coding不死,也未曾凋零 999

Swift的可选类型Optional

如果命中Some(T)的Case,就会得到一个“包装”后的值(a wrapped value),如果想要拿到真正的value,就需要“拆包”,否则你会得到的是Optional(value)。Optional其实是个枚举(enum)(严格来讲:应该是enum和泛型为基础的高阶抽象类型),分别是None和Some(T),如果可选类型为nil就会命中None的Case。如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false。

培根芝士的专栏 1187

窥探Swift之新添数据类型元组与可选值

今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional)。上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些示例来介绍一下如何初始化和使用元组和可选值类型以及使用元组和可选值类型的场景。废话少说,直奔主题,在今天的示例代码中仍然是使用Playground来测试的。左边是代码,右边是Playground中的结

82

Swift之新添数据类型元组与可选值

元组(Tuple)和可选值类型(Optional)。上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些示例来介绍一下如何初始化和使用元组和可选值类型以及使用元组和可选值类型的场景。废话少说,直奔主题,在今天的示例代码中仍然是使用Playground来测试的。左边是代码,右边是Playground中的结果。 一、Swift中的元组(Tuple)   元组类似于C

zhaohongyan6的博客 359

swift optional——swift学习(二)

可选型:optional 强制解包 if let convertedNum = convertedNum{ //不为空执行 }

u012297622的博客 428
上一篇: GPUImage源码解读(十)
下一篇: Xcodegen介绍 | 一款可以帮助你更好的构建Xcode Project的工具
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值