从Storyboard到SwiftUI迁移难?掌握这6步实现无缝过渡

01、SwiftUI IOS 基础入门 本文主要介绍了在 MacOS 上使用 SwiftUI 进行图形应用界面开发的相关知识,包括开发环境、工程创建、基础组件、布局组件、常用方法以及按钮与交互等内容。 阅读详情

第一章:从Storyboard到SwiftUI迁移难?掌握这6步实现无缝过渡

在现代iOS开发中,SwiftUI以其声明式语法和实时预览能力成为主流选择。然而,许多遗留项目仍重度依赖Storyboard,导致团队在技术演进时面临挑战。通过系统化策略,可以平稳地将基于Storyboard的界面逐步迁移至SwiftUI,避免大规模重写带来的风险。

评估现有界面结构

首先梳理当前Storyboard中的视图层级、segues与Auto Layout约束,识别可独立迁移的模块。优先选择功能完整、依赖较少的页面作为切入点。

启用SwiftUI兼容支持

确保项目部署目标支持iOS 13+,并在需要嵌入SwiftUI视图的地方使用UIHostingController:
// 将SwiftUI视图嵌入UIKit导航流
let swiftUIView = MySwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)
navigationController?.pushViewController(hostingController, animated: true)

并行运行Storyboard与SwiftUI

采用渐进式替换策略,在同一应用中同时运行两种界面框架。可通过特性开关或URL路由控制流向:
  1. 为新功能直接使用SwiftUI构建
  2. 旧界面保留Storyboard,逐步重构
  3. 通过协议抽象共用业务逻辑

封装可复用组件

将常用UI元素(如按钮、输入框)封装为SwiftUI视图,便于在多个迁移阶段复用:
struct PrimaryButton: View {
    var action: () -> Void
    var label: String

    var body: some View {
        Button(action: action) {
            Text(label).font(.headline)
        }
        .padding()
        .background(Color.blue)
        .foregroundColor(.white)
        .cornerRadius(8)
    }
}

处理状态与数据流

使用@ObservedObject或@StateObject连接ViewModel,确保与原有MVVM或Coordinator模式兼容。

自动化测试与验证

建立对比测试机制,确保迁移前后用户交互行为一致。可借助XCTest进行UI快照比对。
迁移阶段推荐策略
初期小模块嵌入,验证集成可行性
中期核心页面重构,统一设计系统
后期全面切换,移除Storyboard依赖

第二章:理解Storyboard与SwiftUI的核心差异

2.1 声明式与命令式UI范式的理论对比

在现代用户界面开发中,声明式与命令式是两种核心的编程范式。命令式UI要求开发者明确描述“如何”构建和更新界面,通常通过直接操作DOM或视图层级实现。
代码逻辑差异

// 命令式:逐步修改UI
const button = document.getElementById('btn');
button.innerText = 'Loading...';
button.disabled = true;
该代码显式控制每个状态变更步骤,逻辑清晰但易产生副作用。
声明式优势

// 声明式:描述期望状态
<Button disabled={isLoading}>
  {isLoading ? 'Loading...' : 'Submit'}
</Button>
React等框架通过声明式语法,将UI视为状态函数,自动处理更新逻辑,提升可维护性。
  • 命令式:关注过程,灵活性高但复杂度随规模增长
  • 声明式:关注结果,抽象层级更高,利于逻辑复用

2.2 视图生命周期管理的演变与实践

早期移动开发中,视图生命周期由开发者手动管理,易导致内存泄漏与状态不一致。随着组件化架构兴起,现代框架如 SwiftUI 与 Jetpack Compose 引入声明式语法,将生命周期交由系统自动追踪。
声明式更新机制
@Composable
fun UserProfile(name: String) {
    Text("Hello, $name!")
    // 系统自动监听 name 变化并重组 UI
}
上述代码中,name 参数变化时,Compose 通过组合跟踪自动触发重组,无需手动调用 updateView() 方法。
生命周期回调集成
  • onCreate:初始化视图结构
  • onResume:恢复数据订阅
  • onDestroy:释放资源与取消监听
系统级管理显著降低开发复杂度,提升应用稳定性。

2.3 Auto Layout与SwiftUI布局系统的映射关系

SwiftUI 的声明式布局系统在底层仍依赖于 Auto Layout,但通过更高级的抽象简化了界面构建。两者在约束逻辑上存在明确映射。
核心概念对应
  • NSLayoutConstraint ↔ frame()、padding()
  • Alignment Constraints ↔ HStack/VStack/LazyHGrid
  • Priority Levels ↔ layoutPriority()
代码等价示例
// Auto Layout: 设置宽度约束
view.widthAnchor.constraint(equalToConstant: 100).isActive = true

// SwiftUI 等价实现
View()
    .frame(width: 100)
上述代码中,.frame(width: 100) 在 SwiftUI 中生成与固定宽度锚点约束相同的效果,系统自动将其转换为底层 NSLayoutConstraint。
布局性能对比
特性Auto LayoutSwiftUI
语法复杂度高低
运行时性能中等优化后更高

2.4 组件化思维在SwiftUI中的重构方式

在 SwiftUI 中,组件化思维强调将界面拆分为独立、可复用的视图单元。通过提取公共 UI 逻辑为自定义视图结构体,提升代码可维护性。
基础组件封装
将重复使用的 UI 元素抽象为独立视图,例如:
struct CustomButton: View {
    let title: String
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            Text(title)
                .font(.headline)
                .foregroundColor(.white)
        }
        .padding()
        .background(Color.blue)
        .cornerRadius(8)
    }
}
该组件封装了按钮样式与交互逻辑,title 控制显示文本,action 接收外部回调,实现行为解耦。
状态驱动的组合设计
利用 @State 与 @Binding 实现父子组件间的数据流控制,形成层级清晰的视图树结构,增强可测试性与可扩展性。

2.5 数据流与状态管理机制的根本性转变

现代前端架构中,数据流与状态管理正经历从命令式到声明式的范式转移。传统双向绑定导致状态难以追踪,而新模型强调单一数据源与不可变更新。
集中式状态管理优势
  • 提升组件间通信可预测性
  • 支持时间旅行调试与状态快照
  • 便于服务端渲染与状态同步
响应式更新机制示例
const store = createStore({
  state: { count: 0 },
  mutations: {
    INCREMENT(state) {
      state.count++;
    }
  }
});
// 提交变更触发视图自动更新
store.commit('INCREMENT');
上述代码通过 mutation 显式修改状态,确保所有变化可追踪。state 为唯一数据源,mutation 必须为同步事务,便于调试工具捕获每一步状态变迁。

第三章:迁移前的关键评估与准备工作

3.1 现有项目结构分析与迁移可行性评估

在启动架构迁移前,需对现有项目结构进行系统性剖析。当前项目采用单体架构,核心模块耦合度高,依赖关系复杂。
目录结构示例

project/
├── src/
│   ├── main/
│   │   ├── java/com/example/service
│   │   └── java/com/example/controller
├── pom.xml
└── config/application.yml
该结构缺乏清晰的边界划分,业务逻辑分散于多个包中,不利于微服务拆分。
技术栈依赖分析
  • Spring Boot 2.5.x:支持向新版本平滑升级
  • MySQL 单实例:存在单点风险,建议引入读写分离
  • Maven 多模块管理:具备模块化改造基础
迁移可行性矩阵
维度现状适配性
代码可拆分性中等需重构接口边界
数据独立性低需解耦共享表

3.2 拆分混合界面:共存策略与边界定义

在现代化前端架构演进中,拆分混合界面是实现渐进式重构的关键步骤。系统往往需要新旧技术栈共存,合理的边界定义能降低耦合度,保障协作稳定性。
职责分离原则
通过微前端或组件级隔离,明确新旧模块的控制范围。例如,使用 Web Components 封装新功能,嵌入传统页面:

// 定义轻量级自定义元素
class NewFeature extends HTMLElement {
  connectedCallback() {
    this.innerHTML = `
      
新功能模块
`; } } customElements.define('new-feature', NewFeature);
该代码将新功能封装为可复用的原生 Web 组件,无需依赖框架即可挂载到任意 DOM 节点,实现技术栈解耦。
通信与状态边界
  • 通过事件总线(EventBus)进行松耦合通信
  • 共享状态应集中管理,避免直接操作对方数据模型
  • 接口契约需明确定义版本与数据格式

3.3 依赖项与第三方库的兼容性检查

在构建现代软件系统时,第三方库的引入极大提升了开发效率,但同时也带来了版本冲突与兼容性风险。为确保系统稳定性,必须在集成前对依赖项进行系统性评估。
依赖冲突识别
使用包管理工具(如npm、pip、Go Modules)可生成依赖树,帮助识别重复或不兼容的库版本。例如,在 Go 中执行:
go list -m all
// 输出当前模块及其所有依赖的版本信息
该命令列出项目直接和间接依赖的所有模块,便于审查是否存在多个版本共存的情况。
兼容性验证策略
  • 语义化版本比对:遵循 MAJOR.MINOR.PATCH 规则,主版本号变更通常意味着不兼容更新
  • 自动化测试集成:在 CI 流程中运行跨版本单元测试,验证行为一致性
  • API 差异扫描:使用工具 diff 工具分析库接口变化
检查项推荐工具适用语言
依赖树分析go mod graph / pipdeptreeGo, Python
安全漏洞检测Snyk, Dependabot多语言

第四章:分阶段实现Storyboard到SwiftUI的过渡

4.1 第一步:搭建SwiftUI入口并集成至UIKit应用

在现有UIKit项目中集成SwiftUI,首先需创建一个SwiftUI视图作为入口点。通过UIHostingController包装SwiftUI视图,可实现与UIKit层级的无缝衔接。
创建SwiftUI根视图
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello from SwiftUI!")
            .font(.headline)
    }
}
该代码定义了一个基础SwiftUI视图ContentView,作为集成的起点。body属性返回一个文本视图,使用.headline字体样式。
在UIKit中托管SwiftUI视图
需将SwiftUI视图嵌入UIHostingController,然后添加至导航栈或作为子控制器:
let hostingController = UIHostingController(rootView: ContentView())
window?.rootViewController = hostingController
window?.makeKeyAndVisible()
其中,rootView参数指定SwiftUI内容根节点,UIHostingController负责生命周期管理与界面渲染。

4.2 第二步:将独立视图单元重写为SwiftUI组件

在迁移过程中,核心任务是将UIKit中的独立视图(如自定义Cell或面板)重构为可复用的SwiftUI视图组件。这一过程不仅提升代码的声明式表达能力,也增强了预览与交互效率。
基础组件转换示例
struct ProfileView: View {
    let user: User

    var body: some View {
        HStack {
            Image(user.avatar)
                .resizable()
                .frame(width: 60, height: 60)
                .clipShape(Circle())
            VStack(alignment: .leading) {
                Text(user.name).font(.headline)
                Text("@\(user.username)").foregroundColor(.secondary)
            }
        }.padding()
    }
}
上述代码将用户信息展示逻辑封装为一个纯SwiftUI结构体。其中Image和Text通过组合形成层级布局,padding()控制外边距,整体无需管理视图生命周期。
优势对比
特性UIKitSwiftUI
布局方式Auto Layout + 约束声明式堆栈容器
可复用性需继承与注册结构体直接调用

4.3 第三步:统一状态管理与数据依赖注入机制

在复杂前端应用中,组件间的状态共享与数据流控制至关重要。通过引入集中式状态管理机制,所有组件可访问单一数据源,确保状态一致性。
状态管理核心设计
采用响应式状态容器,将应用状态抽象为可监听的数据模型。变更通过提交动作(action)触发,经由纯函数(reducer)计算生成新状态。
const store = createStore({
  state: { count: 0 },
  mutations: {
    increment(state) {
      state.count += 1;
    }
  }
});
上述代码定义了一个基础状态仓库,state 存储数据,mutations 定义同步状态变更逻辑,确保状态变化可追踪。
依赖注入实现方式
通过上下文(context)机制向下传递 store 实例,避免逐层手动传递 props。
  • 创建全局状态上下文
  • 在根组件注册 provider
  • 子组件通过 inject 获取 store

4.4 第四步:渐进式替换核心页面并验证用户体验一致性

在微前端迁移过程中,渐进式替换核心页面是确保系统稳定性的关键环节。通过路由拦截与模块动态加载,逐步将旧版页面替换为基于独立微应用的新实现。
路由级隔离与懒加载配置

const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: () => import('dashboardApp/Dashboard'), // 动态加载微应用
    meta: { standalone: true } // 标识为独立运行微应用
  }
];
上述代码通过 import() 实现按需加载,meta.standalone 用于运行时判断是否启用沙箱隔离,确保新旧应用共存时不产生样式或状态冲突。
用户体验一致性校验清单
  • 交互响应时间差异控制在 ±100ms 内
  • 全局主题与字体渲染保持统一
  • 导航动效与按钮行为逻辑一致
  • 错误提示样式与文案规范对齐

第五章:总结与展望

技术演进的实际路径
现代Web应用架构正快速向边缘计算和Serverless模式迁移。以Cloudflare Workers为例,开发者可通过轻量级JavaScript函数在边缘节点处理请求,显著降低延迟。以下为一个典型的边缘缓存策略实现:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const cacheUrl = new URL(request.url);
  const cacheKey = new Request(cacheUrl.toString(), request);
  const cache = caches.default;

  // 尝试从边缘缓存读取
  let response = await cache.match(cacheKey);
  if (!response) {
    response = await fetch(request);
    // 缓存成功响应,有效期30秒
    if (response.status === 200) {
      response = response.clone();
      event.waitUntil(cache.put(cacheKey, response));
    }
  }
  return response;
}
未来挑战与应对策略
  • 跨云平台的身份联邦管理将成为多云部署的核心难题
  • AI驱动的自动运维(AIOps)需整合实时日志流与指标预测模型
  • WebAssembly在服务端的普及将重构函数计算的安全边界
技术方向当前成熟度典型应用场景
边缘数据库早期采用实时协同编辑、IoT数据同步
零信任网络访问广泛部署远程办公安全接入

客户端 → [边缘函数] ⇄ [全局负载均衡] → {微服务集群 + 分布式追踪}

↑↓ 实时指标上报 │ 日志聚合 → 异常检测引擎

StoryBoard使用示例 示例列举了使用StoryBoard的详细情况,以及使用多个StoryBoard,StoryBoard与xib文件的混用 立即下载

相关推荐

LatentSync:开源数字人唇形同步技术的实战部署与优化指南

本文详细介绍了开源数字人唇形同步工具LatentSync的实战部署与优化全流程。从核心原理(潜在扩散模型与TREPA技术)解析,到手把手完成环境搭建、模型获取及首次推理。文章深入探讨了自定义素材处理、关键参数调优(如guidance_scale),并提供了显存不足、人脸检测失败等常见问题的解决方案与性能优化技巧,旨在帮助用户高效部署并提升生成效果。

9o8p7i6u5y的博客 1008

IOS开发之SwiftUI学习笔记(一)

SwiftUI是什么 SwiftUI在苹果开发者官网上的介绍是这样说的: 用一句话说就是,SwiftUI是苹果目前最新的全平台应用程序创建框架。 我对SwiftUI的印象 其实本来我是打算学Flutter的,但是Flutter的配置过程相当繁琐,我配置了两天,终于还是被层出不穷的报错击溃了耐心,从而转向学IOS原生开发。 SwiftUI是2019年发布的,到现在不到两年的时间。苹果这次是把View层和Model层结合到了一起,即所谓的“所见皆所得”,比如这样: import SwiftUI struct

m0_37508087的博客 2531

从亚稳态到流片失败:SpyGlass CDC在5G芯片设计中的避坑指南

本文深入探讨了在复杂5G芯片设计中,如何利用SpyGlass CDC工具构建高效的时钟域交叉验证流程,以避免因亚稳态问题导致的流片失败。文章结合实战经验,详细解析了从约束编写、时钟复位完整性检查到层次化验证和特殊场景处理的全过程,并强调了精准的检查约束是确保验证有效性的基石,旨在帮助设计团队安全跨越异步时钟域的雷区。

weixin_29168153的博客 446

SwiftUI vs 故事板

Paul Hudson @twostraws September 16th 2019 每个有经验的iOS开发人员都熟悉Interface Builder和Storyboard,甚至XIB也是如此。他们可能不喜欢它们,但至少对它们熟悉。如果您以前从未使用过这些功能,则应该跳过此位。 还在?好的-这意味着您以前使用过IB,并且可能会对SwiftUI的不同感到好奇。 好吧,让我问您一个问题:您是否曾经手动编辑情节提要或XIB? 可能不会。好吧,除了那一次,但答案是肯定的-故事板和XIB包含相...

互动教程网[www.hdjc8.com] 2282

Ferry工单平台部署

ferry工单平台部署

运维求生之路 1897

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

驾驭 StoryBoard

代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/DifferentWaysToBuildTheUserInterface 本系列文章中,我们将一起认识、了解当下 iOS 开发中几种常见的 UI 构建方式,分析他们分别适合的使用...

chunqingtai2922的博客 242

PHP证书图片生成

$realname = "姓名"; $schoolname = "学校"; $idcard = "身份证号"; $image = imagecreatefrompng('certification.png'); // 证书模版图片文件的路径 $red = imagecolorallocate($image,00,00,00); // 字体颜色

4036

从Storyboard到SwiftUI:3个月转型实战经验全分享

掌握SwiftUI高效开发秘诀,3个月实现从Storyboard到声明式UI的平滑转型。结合1024工程师节实战经验,详解Swift SwiftUI在iOS界面开发中的实际应用,涵盖适配技巧、组件封装与性能优化,提升开发效率,值得收藏。

VarFlow的博客 762

electron:解决打包后报错Cannot find module ‘X‘ 运行报错各种模块缺失问题(解决electron build打包后运行应用报错启动失败或白屏,无论模块名称是什么都能解决!)

Electron app打包后启动报错:“Cannot find module 'X'”解决方案,electron-builder 打包出现 cannot find module,electron 打包后找不到module问题,electron打包运行白屏、Can not find modules ‘x‘,electron项目打包报错,electron打包后,点击生成的exe应用程序出现Cannot find module,解决electron-build打包后运行app报错:cannot find mod

✅ 精选推荐文章 4386

12S BMS 核心设计:基于 STM32H743+BQ34Z100 的 SOC/SOH 实现与全链路技术解析(上)

本文详细介绍了基于STM32H743和BQ34Z100的12串锂电池管理系统(BMS)设计。该系统采用主控制器+专用电量监测计架构,可实现高精度SOC(±1%)和SOH(±2%)估算,支持36V-50.4V电压范围。硬件设计包括电压/电流采样、温度测量、保护电路等模块,软件实现基于HAL库开发,采用DMA方式提高I2C通信效率。系统通过TI专利的ImpedanceTrack™算法实现三维融合估算,并具备完善的保护功能。该设计适用于电动工具、轻型电动车等中功率设备,具有精度高、响应快。

bother3000的博客 1393

告别Storyboard!用SwiftUI的View组件化思维重构你的老项目

本文探讨了如何利用SwiftUI的组件化思维重构传统Storyboard项目,提升开发效率和代码可维护性。通过对比UIKit与SwiftUI的编程范式差异,提供渐进式迁移策略和组件化设计最佳实践,帮助开发者顺利过渡到声明式UI开发。文章包含实际代码示例,展示如何将复杂布局和导航模式转换为SwiftUI实现,并分享性能优化技巧。

weixin_30279671的博客 374

如何在 UniApp 中接入讯飞语音听写功能 文末附vue3+vue2完整代码

在开发过程中,我遇到了讯飞接口返回空数据的问题。通过仔细检查传送的每一帧数据,我发现问题出在第一帧的配置信息以及 Base64 数据的切片。确保每一帧的数据正确且符合接口要求,问题就能够得到解决。希望这个过程能帮助你在项目中顺利对接讯飞语音识别。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 998

iOS9 STORYBOARD REFERENCE

苹果在iOS9推出了storyboard reference的概念,它允许开发者在把页面放置在不同的storyboard中的情况下,保持各个storyboard的关联,这也使得页面间的逻辑关系更清晰和易于管理。

lyqfly07的博客 690

深度学习工具包 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")

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IBDecodable:将XIB和Storyboard文件转换为Swift模型的利器

IBDecodable:将XIB和Storyboard文件转换为Swift模型的利器 项目介绍 IBDecodable是一款强大的工具,专门用于将.xib和.storyboard文件中的XML内容转换为Swift模型。无论你是iOS开发者还是Swift爱好者,IBDecodable都能帮助你轻松解析和操作这些常见的界面构建文件。通过将复杂的XML结构转换为易于处理的Swift对象,IBDecoda...

gitblog_00003的博客 506

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IOS 移除storyboard

我是IOS新手,都说storyboard是个好东西,但是我搞了一会始终没有搞懂,并且我觉得学习一门语言,使用类似以前网页三剑客这种所见所得工具,不太利于学习,所以我就想着移除storyboard1:我们通过xcode新建的项目,默认会有个Main.storyboard ,我们就是要干掉这个2:移除storyboard3:删除Main.storyboard 之后,再启动app就和黑屏,这个时候就需要

编程浪子的博客 250

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

告别13步繁琐流程:macOS应用“开机自启“功能极速集成指南

你是否还在为macOS应用添加"开机自启"(Launch at Login)功能而头疼?传统实现需要手动配置13个步骤,涉及Helper App创建、沙箱设置、代码签名等复杂操作,稍有不慎就会导致功能失效或上架失败。本文将带你用2步完成这一功能集成,同时兼容macOS 10.13至最新版本,让你的应用轻松满足用户开机启动需求。 读完本文你将获得: - 传统自启功能实现的13个痛点解析 - Lau

gitblog_01129的博客 963

一个属性让TabBar变样:SSCustomTabbar的reverseCurve反转曲线效果详解

SSCustomTabbar 是一款专为 iOS 打造的波浪动画底部 TabBar 开源库,支持 UIKit 与 SwiftUI 双栈使用。它最惊艳的特性之一,就是只需打开一个名为 `reverseCurve` 的反转曲线属性,就能让 TabBar 的波浪造型"翻转"成另一种风格——本文带你快速搞懂这个反转曲线效果的原理、启用方式和可调参数,几分钟就能给你的 App 换上会动的波浪导航栏。 ##

gitblog_00452的博客 200

iOS13 Scene Delegate详解

iOS13 项目中的SceneDelegate类有什么作用?自从Xcode11发布以来,当你使用新XCode创建一个新的iOS项目时,SceneDelegate会被默认创建,它到底有什么用呢。 在本文中,我们将深入探讨iOS 13和Xcode 11的一些变化。我们将重点关注SceneDelegate和AppDelegate,以及它们如何影响SwiftUI、Storyboard和基于XIB的UI项目。 通过阅读本文你将了解到: SceneDelegate和AppDelegate的新变化 他们是如何合作

酸柠檬的博客 1339

BButton:iOS开发者的Bootstrap风格按钮组件深度解析

在iOS应用开发中,按钮作为最基础的交互组件,其设计质量和开发效率直接影响用户体验和开发周期。传统UIButton虽然功能完备,但在样式定制和视觉一致性方面常常让开发者陷入重复劳动。BButton应运而生,这个开源项目将Twitter Bootstrap的设计理念引入iOS平台,为开发者提供了一套优雅、可复用且高度可配置的按钮组件系统。 ## 项目价值定位:为什么iOS开发者需要BButton?

gitblog_00017的博客 607

快速创建UILabel、UIButton、UIImageView、UITextField——链式编程

================================ ============ Interface======================================== // // UIView+SpeedCreat.h // UIViewSpeedCreat // // Created by humiaor on 2019/3/1. // Copyright ©...

humiaor的博客 346

ios 之 随机数

每个有经验的iOS开发人员都熟悉Interface Builder和Storyboard,甚至XIB也是如此。他们可能不喜欢它们,但至少对它们熟悉。如果您以前从未使用过这些功能,则应该跳过此位。目前应该没有什么关系,对于简单UI来讲,没什么大不了的了,随便了,用Swift吧,毕竟是未来。故事板和XIB包含相当多的XML,这些XML不容易阅读或编辑。

HeroIsUseless的博客 298

TGLStackedViewController源码解析:深入iOS UICollectionView扩展

TGLStackedViewController是一个强大的iOS UI组件,它实现了基于手势的堆叠式卡片布局,灵感来自于Passbook和Reminders应用。这个开源项目为开发者提供了一个优雅的解决方案,用于创建具有视觉吸引力的堆叠式界面,支持手势重新排序和交互式展开/折叠功能。通过深入分析其源码架构,我们可以学习到如何扩展UICollectionView来实现复杂的交互式布局。 ## ?

gitblog_00808的博客 412

Xcode 进行ios开发报错:Lauch screens may not have triggered segues.

问题描述 原因探究 现在ios主推用storyboard进行开发。在最新的xcode13.3中,创建project时需要选择storyboard而非swiftUI,之后便能在左侧侧边看见 其中launchscreen.storyboard 和 main.storyboard 是完全不同的两个东西。launchscreen是用户在应用程序完成启动之前点击应用程序图标时首先出现的内容.它显示一个单一的静态屏幕.它不能是动态的,也不能使用任何自定义类或代码.它是启动图像的替代品. main是应用运行时实际显示

abracadabraa的博客 2293

春天来了

虽然一直心向往了解 Mac 世界,但无论是工作、日常需要还是经济考虑,都让我一次次放弃了采购计划。2020 年初,在遭遇了“新冠肺炎”疫情之时。由于待机在家,下了决心买了台 Mac mini。由于疫情影响,首先是 Apple 发货居然用了三周,然后顺丰快递由于没有足够人手,又滞留了三天。我亲自到快递点,三四个小哥帮我从堆积如山——没错,就是山,真的是山啊——的快递滞留件中挖出了我的 mini。 工...

人称大叔的博客 279

iOS 将一个数组中的数据插入到另一个数组中~总结

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 // 要插入的位置 NSIndexSet *helpIndex = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, [SHArr count])]; // 要插入的数组 [self.helpArr insertObj

石虎 9949
上一篇: PHP错误日志监控实战:快速定位线上故障的秘籍(运维高手都在用)
下一篇: 掌握这7种Kotlin扩展函数写法,让你的Android代码简洁又高效
InitFlow
博客等级 码龄1年 145粉丝 2166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值