iOS经典讲解之Swift枚举(Enum)、协议(protocol)、扩展(Extension)

Swift中文手册实战指南:从工具链到并发避坑 编程语言学习常卡在环境与语法细节上。以Swift为例,其中文手册系统讲解类型安全、可选型、协议与并发模型,但初学者直面目录容易迷失。掌握语言关键不在于背诵语法,而在于理解设计原理:let/var定义可变性,值类型与引用类型决定内存语义,结构化并发让异步代码更可读。技术价值在于工程实践中减少隐性bug,例如强制解包导致的崩溃、闭包循环引用、并发任务顺序错乱。应用场景覆盖iOS/macOS开发、服务端及脚本工具,开发者可利用REPL、Swift包管理器构建验证闭环,从“能跑”走向“能稳”。本文从工具链搭建到避坑 阅读详情

作者:Loving_iOS

转载请标明出处:http://blog.youkuaiyun.com/loving_ios/article/details/49406865

本次开发环境为Xcode7.0.1 创建playground文件 进行的代码编写。

//**********************枚举**************************

//enum 枚举名:类型 {
//    
//    case 分支1 = 赋值1
//    case 分支2 = 赋值2
//    
//}

enum PersonIndetity:String {
    case Teacher = "Teacher_id"
    case Student = "Student_id"
}

// 类
class Person {
    
    var indeitity:PersonIndetity
    var name:String
    var age:String
    
    // 类的构造器
    init(name:String, age:String, idd:PersonIndetity) {
        self.indeitity = idd
        self.name = name
        self.age = age
    }
    
    func hello() {
        print("hello")
    }
    // 类方法
    class func hello2() {
        
    }
    
}

// 枚举 枚举名.类型 其中枚举名可以省略
var person = Person(name: "Tom", age: "30", idd: PersonIndetity.Student)

// 枚举值得获取
// 获取当前分支
person.indeitity.hashValue
// 获得分区的值
person.indeitity.rawValue

// 继承 类名:父类名

class Student:Person {
    
    // 子类的属性
    var classNumber:Int = 23
    init(name: String, age: String, idd: PersonIndetity, classNumber:Int) {
        
        // 如果属性仅指定类型 需要在super.init之前进行赋值操作
        super.init(name: name, age: age, idd: idd)
        self.classNumber = classNumber
        
    }
    
    // 重写父类方法 需要使用override关键字
    override func hello() {
        
    }
  override class func hello2() {
    
    }
    
}

// 协议
protocol OneProtocol {
    
    func typeFunc()
    static func typeFunc2()
    mutating func typeFunc3()
    
}

// 类和结构体实现协议方法的时候 需要根据本身的语法规则做出调整

class newStudent:OneProtocol {
    
    func typeFunc() {
        
    }
    class func typeFunc2() {
        
    }
    
   func typeFunc3() {
        
    }
}


struct VideoNew:OneProtocol {
    
    func typeFunc() {
        
    }
    static func typeFunc2() {
        
    }
   mutating func typeFunc3() {
        
    }
}

// 类同时继承父类和协议的时候 父类必须写在前面
//class StudentNew:Person, OneProtocol {
//    
//}

@objc protocol SecondProtocol {
    optional func hello()
}

// 注意:当协议中方法使用optional 声明可选方法时 协议必须声明成@objc 此时的协议为类协议 不能被结构体继承


// 扩展
var value:String = ""
extension Person {
    
    func helloworld() {
        
    }
    
    // 如果想扩展属性 只能是计算属性
    var stu:String {
        get{
            
            return value
        }
        set {
            value = newValue
        }
    }
    
    // 扩展构造器需要使用convenience
    convenience init(name:String, age:String, idd:PersonIndetity, stu:String) {
        self.init(name:name, age:age, idd:idd)
        self.stu = stu
    }
}

var person_one = Person(name: "Tom", age: "20", idd: PersonIndetity.Student, stu: "帅哥")
person_one.stu
person_one.stu = "靓妹"
person_one.stu

基于点云数据的统计滤波算法改进 随着三维视觉和点云处理技术的发展,点云数据在机器人、自动驾驶、增强现实等领域得到了广泛应用。而点云数据中常常包含着各种噪声和异常点,这些噪声和异常点会影响后续的数据处理和分析任务。因此,对点云数据进行滤波处理是必不可少的一步。在点云滤波算法中,统计滤波(Statistical Filtering)是一种常见且有效的方法。它通过对点云数据进行统计分析,将噪声和异常点剔除或修复,从而得到更为准确和可靠的点云数据。本文将介绍一种改进的统计滤波算法,并提供相应的源代码实现。 阅读详情

相关推荐

数字孪生驱动的城市地下管网智能运维与应急处置决策支持系统

上海市城市数字化中心的数据实践显示,通过关联分析管网材质与故障率的关系,将铸铁管更换周期从15年优化至8年(李敏,2021)。环境效益方面,上海市通过优化管网运行参数,年减少碳排放1.8万吨,相当于种植36万棵乔木。数字孪生与物理设备的双向交互采用OPC UA协议实现,某次天津管网渗漏事件中,系统通过实时数据反馈,指导现场人员调整注浆方案,将修复时间从48小时压缩至16小时。虚拟指挥沙盘支持多视角协同,深圳水务系统的实践表明,通过AR可视化技术,跨部门会议效率提升60%,方案决策时间缩短40%。

2501_92431686的博客 1426

Swift 在枚举中使用协议(Protocols)和协议扩展(Protocol Extension)

Swift 在枚举中使用协议(Protocols)和协议扩展(Protocol Extension)

1076

算法-基于MACD的Adaboost股价涨跌预测模型

MACD是一个指标,具体用法是MACD>0看涨,反之看跌,果真是这样的吗?由于所有的技术指标都基于对历史数据的统计,指标的滞后性也就难免,有时候MACD明明大于0,股价仍然跌,有时候macd小于0,股价仍然涨。 本文基于Adaboost算法提出了一种基于macd的线性阀值分类器作为若分类器,通过在限定的解空间内寻找使得错误率最小的阀值和偏置,这样做避免了训练若分类器的复杂性,经验证,这种方法有效。

mtaxot的博客 8023

swift——枚举

文章目录参考文章:一、功能1.1 语法示例 参考文章: Swift枚举的全用法 swift中的枚举,相较于OC,功能更加强大,允许出现更多的值类型,可以封装方法,遵守协议,实现拓展,使用范型 一、功能 1.1 语法示例 enum Movement { case letf case right case top case bottom } 1.2 值类型 不同于OC的枚举只能为int型,swift允许的值类型有: ● 整型(Integer) ● 浮点数(Float Po

qq_44865905的博客 838

【NLG】(六)文本生成评价指标—— ROUGE原理及代码示例

前奏: 【NLG】(一)文本生成评价指标——BLEU原理及代码示例 【NLG】(二)文本生成评价指标—— METEOR原理及代码示例 【NLG】(三)文本生成评价指标—— ENTROPY原理及代码示例 【NLG】(四)文本生成评价指标—— diversity原理及代码示例 【NLG】(五)文本生成评价指标—— kl_divergence原理及代码示例 1.ROUGE原理 2.优缺点 3.如何算ROUGE ...

凝眸伏笔的博客 1万+

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

Swift -- enum 继承 protocol

原文地址链接:http://blog.youkuaiyun.com/duanyipeng/article/details/32338575 Apple官方文档:The Swift Programming LanguageProtocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵循ExampleProtocol协议:    protocol...

weixin_34104341的博客 268

x2-DFD:A framework for explainable and explainable deepfake detection

该文章提出了X2-DFD框架,用于可解释和可扩展的深度伪造检测。通过评估大型多模态语言模型(MLLMs)在深度伪造检测中的内在能力,发现它们在不同伪造相关特征上的有效性各异。基于此,实施了针对性的微调策略,显著提高了MLLMs的解释能力,并整合了外部深度伪造检测器(EDDs),以结合MLLMs和传统检测器的互补优势,实现更好的检测和解释。

志在山顶的人,不会贪念山腰的风景 510

IOS开发Swift笔记19-扩展(Extension)

扩展(Extension) Swift中的扩展,有点类似于OC中的分类(Category) 扩展可以为枚举、结构体、类、协议添加新功能 可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等等 扩展不能办到的事情 不能覆盖原有的功能 不能添加存储属性,不能向已有的属性添加属性观察器 不能添加父类 不能添加指定初始化器,不能添加反初始化器 … 计算属性、下标、方法、嵌套类型 extension Double { var km: Double { self * 1_000.0 }

qq_25218777的博客 603

合肥工业大学操作系统实验8

依据操作系统课程所介绍的地址映射与内存共享的原理,本实验的目的是深入理解物理内存的分页管理方式。 深入理解操作系统的段、页式内存管理。包括理解段表、二级页表,以及逻辑地址、线性地址、 物理地址的映射过程。编程实现段、页式内存管理上的内存共享,从而深入理解操作系统的内存管理。从而加深对教材上地址映射与内存共享的理解。

Martin-share的博客 1721

QGis二次开发 —— 5.2、基于qgis搭建离线地图服务并开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

QGis二次开发 —— 5.2、基于qgis搭建离线地图服务并开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

224

swift3.0枚举遵守协议

这是swift3.0官方文档协议那一节给出的协议 protocol ExampleProtocol { var simpleDescription: String { get } func adjust() } 所留练习: 写一个实现这个协议的枚举 用的很多方法 都没实现(本人悟性比较低), 最后在网上找了相关文章 终于实现了 记录下来以便以后查看 enum Simpl...

z284680965的博客 551

RTDETR最强结构图 | 包含模型整体结构图 | 全模块展开图 | AiFi模块展开图

RT-DETR 最全结构图

Coding... 9600

Swift 扩展(Extensions)完全指南:为现有类型添加功能与追溯建模实践

扩展(Extensions)是 Swift 语言中用于为现有类、结构体、枚举或协议类型添加新功能的核心机制,也是《Swift 编程语言》中文版(TSPL)语言指南中的关键章节。本指南以 [TSPL.docc/LanguageGuide/Extensions.md](https://link.gitcode.com/i/3e2d792cbe6b4fa3ae1c5474194fc6c9) 为骨架,结合

gitblog_00870的博客 1108

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

《Learn X in Y minutes》Swift 速成指南全解读:基于 learnxinyminutes-docs 的 Swift 核心语法实战

> 本文以 learnxinyminutes-docs 仓库中的土耳其语 Swift 教程 [tr/swift.md](https://link.gitcode.com/i/8acbc351ba98fe852c3a0fcdd3e60c68) 为主线,结合仓库根目录的英文原版 [swift.md](https://link.gitcode.com/i/db6e5bdad4af112db3e153d8

gitblog_00699的博客 1127

数学建模模型总结

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

ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

swift关键字 符号

goodgoodstudy___的博客 627

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Eureka 表单框架完全指南:用 Swift 优雅构建 iOS 声明式表单、自定义 Row 与验证体系

Eureka 是一个由 XMARTLABS 用纯 Swift 编写的 iOS 表单生成框架,本质上是经典库 XLForm 的 Swift 重构版本,通过 DSL 式自定义操作符(`+++`、`<<<`、`+=`)让开发者像搭积木一样组合 `Section` 与 `Row`,即可生成完整可交互的表单界面。本文以仓库 [Documentation/README_CN.md](https://link.

gitblog_01171的博客 889

如何用Voice-Clone-Studio生成90分钟多说话人播客:VibeVoice与Qwen3对话引擎完整指南

**Voice-Clone-Studio** 是一个基于 Gradio 的语音克隆 Web 应用,由 Qwen3-TTS 与 VibeVoice 双引擎驱动,内置 Conversation(对话生成)工具,支持一次生成**最长 90 分钟、最多 4 位说话人**的连续播客音频。本文带你从安装、准备声音样本到写出播客剧本,一步步用 VibeVoice 长文本引擎生成多说话人播客,并对比 Qwen3

gitblog_01110的博客 458

Swift 语言速成指南:从语法基础到面向对象与泛型实战(Learn X in Y minutes 系列)

**Swift** 是 Apple 于 2014 年 WWDC 大会推出的编程语言,面向苹果全系操作系统开发,旨在与 Objective-C 共存的同时提供更强的代码健壮性。本指南以 learnxinyminutes-docs 仓库根目录下的 [swift.md](https://link.gitcode.com/i/9d9012d64b00c37b8fb490c3874602fb) 为骨架,将这

gitblog_00455的博客 163

ECC Swift 构建错误解析器实战指南:从诊断命令到最小外科手术式修复的完整工作流

本文基于 ECC(Agent Harness 性能优化系统)中的 `swift-build-resolver` 代理规范,系统讲解 Swift/Xcode 构建失败的诊断、定位与修复方法论:从 `swift build`、`swiftlint`、`swift package resolve` 等命令的排查顺序,到类型检查、协议准循、Swift Concurrency 与 `Sendable`、SP

gitblog_00943的博客 392

Swift--enum枚举,协议CaseIterable

功能用法: 1.常规: enum PrinterType : String , CaseIterable { case receipt = "Receipt" case kitchen = "Kitchen" case bar = "Bar" case packing = "Packing" case label = "Label" } print...

SoftwareDoger的博客 1815

Swift-枚举、结构体、协议

用enum来创建枚举。不同的是,在Swift中,枚举可以包含方法。 我们用扑克牌来举个栗子,Rank是对牌值的枚举,A,2~10,J,Q,K。 enum Rank: Int { case Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King func simpleDesc

iCodeWoods 1890

Swift中枚举的高级用法

本章你会学会Swift中枚举的一些高级用法

王偃飞的博客 1109

Swift-30-高级编程 - extension类型扩展和协议扩展

一站式掌握Mac OS、IOS电脑和手机App程序设计开发。本节主要讲下Swift语言的扩展这一主题

编程是一门实践技术 1184

Swift-扩展

扩展可以给一个现有的类,结构体,枚举,还有协议添加新的功能。 拥有不需要访问被扩展类型源代码就能完成扩展的能力(即逆向建模)。(扩展和 Objective-C 的分类很相似,与 Objective-C 分类不同的是,Swift 扩展是没有名字的。) Swift 中的扩展可以: 添加计算型实例属性和计算型类属性 定义实例方法和类方法 提供新的构造器 定义下标 定义和使用新的嵌套类型 使已经存在...

hkasdfiu12 238

Swift-属性、方法(继承、重写)、初始化

Swift中跟市里相关的属性可以分为2大类 存储属性(Strored Property) 类似于成员变量的概念,存储在实例的内存中,结构体、类可以定义存储属性,枚举不可以定义存储属性

qq_27909209的博客 2097
上一篇: iOS经典讲解之Swift结构体和类
下一篇: iOS经典讲解之在navigationBar上面添加多个任意控件
刘新林
博客等级 码龄11年 72粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值