72、Swift开发入门与iOS应用开发技术详解

Swift开发入门与iOS应用开发技术详解

1. Swift基础特性

1.1 子类化与初始化

子类化是一种非常有用的技术。例如,我们可以创建一个 ColoredCircleClass 的实例:

coloredCircle = ColoredCircleClass(radius: 20, color: UIColor.redColor())
coloredCircle.radius    // Result: 20
coloredCircle.color     // Result: red
coloredCircle.description
                        // Result: "Circle of radius 20.0, color UIDeviceRGBColorSpace 1 0 0 1"

这里通过特定的初始化方法创建了一个彩色圆形对象,并可以访问其属性和描述信息。

1.2 协议

协议是一组方法、初始化器和属性的声明,类、结构体或枚举可以通过提供这些声明的实现来遵循协议。以下是一个名为 Resizable 的协议定义:

protocol Resizable {
    var width: Float { get set }
    var height: Float { get set }

    init(width: Float, height: Float)
    func resizeBy(#wFactor: Float, hFactor: Float) -> Void
}

这个协议要求遵循它的类型提供两个属性、一个初始化器和一个函数。下面是一个遵循 Resizable 协议的 Rectangle 类:

class Rectangle : Resizable, Printable {
    var width: Float
    var height: Float
    var description: String {
        return "Rectangle, width \(width), height \(height)"
    }

    required init(width: Float, height: Float) {
        self.width = width
        self.height = height
    }

    func resizeBy(#wFactor: Float, hFactor: Float) -> Void {
        width *= wFactor
        height *= hFactor
    }
}

一个类型通过在其声明中包含协议名称来声明遵循该协议。如果协议要求实现一个初始化器,那么这个初始化器必须标记为 required 。遵循 Printable 协议的类型需要提供一个名为 description String 属性,用于提供该类型的可读表示。例如:

let rect = Rectangle(width: 10, height: 20)
println(rect)    // Prints "Rectangle, width 10.0, height 20.0"

需要注意的是,在编写本文时,如果在Playground中运行此代码,可能无法得到正确结果。可以将 println(rect) 替换为 println(rect.description) 来解决这个问题,这是Xcode的Playground实现中的一个已知问题,在应用程序中代码可以正常工作。

1.3 扩展

扩展是Swift与Objective - C共有的强大特性,它允许向任何类、结构体或枚举添加功能,包括标准Swift库或系统框架中的类型。以下是一个向 UIColor 类添加返回随机颜色方法的扩展:

extension UIColor {
    class func randomColor() -> UIColor {
        let red = CGFloat(Double((arc4random() % 256))/255)
        let green = CGFloat(Double(arc4random() % 256)/255)
        let blue = CGFloat(Double(arc4random() % 256)/255)
        return UIColor(red: red, green: green, blue: blue, alpha:1.0)
    }
}

使用这个扩展的方法如下:

let randomColor = UIColor.randomColor()

2. iOS应用开发相关技术

2.1 背景处理

应用程序的背景处理涉及多个方面,包括应用程序的生命周期和状态变化通知。应用程序的生命周期包括活动状态、非活动状态、后台状态、暂停状态和未运行状态。状态变化通知通过委托方法实现,例如:
- applicationDidBecomeActive() :应用程序变为活动状态时调用。
- applicationDidEnterBackground() :应用程序进入后台时调用。
- applicationWillEnterForeground() :应用程序即将进入前台时调用。
- applicationWillResignActive() :应用程序即将变为非活动状态时调用。
- applicationWillTerminate() :应用程序即将终止时调用。

以下是一个简单的状态变化处理示例:

func applicationDidEnterBackground(application: UIApplication) {
    // 保存状态
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setInteger(selectedIndex, forKey: "selectedIndex")
    defaults.synchronize()
}

func applicationWillEnterForeground(application: UIApplication) {
    // 恢复状态
    let defaults = NSUserDefaults.standardUserDefaults()
    selectedIndex = defaults.integerForKey("selectedIndex")
}

2.2 数据持久化

数据持久化是iOS应用开发中的重要部分,包括应用程序沙盒、文件保存策略、属性列表、归档模型对象和使用SQLite3数据库等。
- 应用程序沙盒 :包含文档目录、库目录和临时目录。

let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let libraryDirectory = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0] as String
let tmpDirectory = NSTemporaryDirectory()
  • 文件保存策略 :包括单文件持久化和多文件持久化。
  • 属性列表 :可以用于序列化和反序列化数据。
let data = ["name": "John", "age": 30]
let plistPath = documentsDirectory.stringByAppendingPathComponent("data.plist")
data.writeToFile(plistPath, atomically: true)
  • 归档模型对象 :通过遵循 NSCoding 协议实现。
class Person: NSObject, NSCoding {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    required init(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObjectForKey("name") as String
        age = aDecoder.decodeIntegerForKey("age")
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(name, forKey: "name")
        aCoder.encodeInteger(age, forKey: "age")
    }
}
  • SQLite3数据库 :具有创建、打开和使用绑定变量等操作。
import SQLite3

let dbPath = documentsDirectory.stringByAppendingPathComponent("database.sqlite")
var db: COpaquePointer = nil
if sqlite3_open(dbPath, &db) == SQLITE_OK {
    // 执行SQL语句
    let createTableSQL = "CREATE TABLE IF NOT EXISTS Persons (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Age INTEGER);"
    if sqlite3_exec(db, createTableSQL, nil, nil, nil) != SQLITE_OK {
        println("创建表失败: \(String.fromCString(sqlite3_errmsg(db)))")
    }
    sqlite3_close(db)
}

2.3 视图和布局

在iOS应用开发中,视图和布局是构建用户界面的关键。可以使用Interface Builder进行界面设计,也可以通过代码实现。
- 自动布局约束 :用于在不同设备和屏幕方向上保持界面的一致性。

let view = UIView()
let label = UILabel()
view.addSubview(label)

label.translatesAutoresizingMaskIntoConstraints = false
let leadingConstraint = NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1.0, constant: 20)
let topConstraint = NSLayoutConstraint(item: label, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 20)
NSLayoutConstraint.activateConstraints([leadingConstraint, topConstraint])
  • 大小类 :用于适应不同设备的屏幕尺寸。
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if traitCollection.verticalSizeClass == .Compact {
        // 处理垂直紧凑尺寸类
    }
}

2.4 触摸和手势识别

iOS应用支持多种触摸和手势识别,包括点击、滑动、捏合和旋转等。
- 触摸事件 :通过 UITouch 对象处理。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in touches {
        let location = touch.locationInView(self.view)
        // 处理触摸开始事件
    }
}
  • 手势识别器 :可以自动识别常见的手势。
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
view.addGestureRecognizer(tapGesture)

func handleTap(gesture: UITapGestureRecognizer) {
    // 处理点击手势
}

2.5 位置和地图

使用Core Location和Map Kit框架可以实现位置跟踪和地图显示。
- 位置管理器 :用于获取设备的位置信息。

import CoreLocation

let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()

extension ViewController: CLLocationManagerDelegate {
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations.last!
        let latitude = location.coordinate.latitude
        let longitude = location.coordinate.longitude
        // 处理位置更新
    }
}
  • 地图视图 :用于显示地图和标记位置。
import MapKit

let mapView = MKMapView()
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194)
mapView.addAnnotation(annotation)

2.6 相机和照片库

使用 UIImagePickerController 可以访问相机和照片库。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    let imagePicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()
        imagePicker.delegate = self
    }

    func openCamera() {
        if UIImagePickerController.isSourceTypeAvailable(.Camera) {
            imagePicker.sourceType = .Camera
            presentViewController(imagePicker, animated: true, completion: nil)
        }
    }

    func openPhotoLibrary() {
        imagePicker.sourceType = .PhotoLibrary
        presentViewController(imagePicker, animated: true, completion: nil)
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
            // 处理选择的图像
        }
        dismissViewControllerAnimated(true, completion: nil)
    }
}

2.7 应用程序本地化

应用程序本地化可以使应用支持多种语言。
- 字符串文件 :包含本地化的字符串。

let localizedString = NSLocalizedString("Hello", comment: "")
  • 本地化项目 :通过设置项目的本地化选项和创建不同语言的字符串文件来实现。

2.8 多视图应用

多视图应用包括常见的类型,如标签栏应用、导航控制器应用和分割视图应用。
- 标签栏控制器 :用于在不同视图之间切换。

let tabBarController = UITabBarController()
let viewController1 = UIViewController()
let viewController2 = UIViewController()
tabBarController.viewControllers = [viewController1, viewController2]
  • 导航控制器 :用于管理视图控制器的堆栈。
let navigationController = UINavigationController(rootViewController: viewController)
  • 分割视图控制器 :用于在iPad上显示主 - 详细视图。
let splitViewController = UISplitViewController()
let masterViewController = MasterViewController()
let detailViewController = DetailViewController()
splitViewController.viewControllers = [masterViewController, detailViewController]

2.9 表格视图

表格视图用于显示列表数据,支持自定义单元格和分组、索引等功能。
- 简单表格

class TableViewController: UITableViewController {
    let data = ["Item 1", "Item 2", "Item 3"]

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }
}
  • 自定义单元格 :可以通过创建自定义的 UITableViewCell 子类来实现。
class CustomTableViewCell: UITableViewCell {
    let customLabel = UILabel()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        contentView.addSubview(customLabel)
        // 设置约束
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

2.10 集合视图

集合视图用于显示网格或流式布局的数据。

class CollectionViewController: UICollectionViewController {
    let data = ["Item 1", "Item 2", "Item 3"]

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return data.count
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)
        let label = cell.viewWithTag(1) as! UILabel
        label.text = data[indexPath.item]
        return cell
    }
}

2.11 精灵套件

精灵套件(Sprite Kit)用于开发2D游戏,包括场景、精灵和物理引擎等。

import SpriteKit

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        let sprite = SKSpriteNode(imageNamed: "Spaceship")
        sprite.position = CGPoint(x: size.width/2, y: size.height/2)
        addChild(sprite)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch in touches {
            let location = touch.locationInNode(self)
            let sprite = SKSpriteNode(imageNamed: "Bullet")
            sprite.position = location
            addChild(sprite)
        }
    }
}

2.12 多核调度和后台处理

Grand Central Dispatch(GCD)用于处理并发任务,后台处理可以在应用程序进入后台时继续执行任务。
- GCD

let queue = dispatch_queue_create("com.example.queue", nil)
dispatch_async(queue) {
    // 执行耗时任务
    dispatch_async(dispatch_get_main_queue()) {
        // 更新UI
    }
}
  • 后台处理
func applicationDidEnterBackground(application: UIApplication) {
    var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
    backgroundTask = application.beginBackgroundTaskWithExpirationHandler {
        application.endBackgroundTask(backgroundTask)
        backgroundTask = UIBackgroundTaskInvalid
    }

    // 执行后台任务
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        // 任务完成后结束后台任务
        application.endBackgroundTask(backgroundTask)
        backgroundTask = UIBackgroundTaskInvalid
    }
}

2.13 动画和过渡

可以使用Core Animation和UIKit动画来实现视图的动画效果和过渡。
- UIKit动画

UIView.animateWithDuration(0.5) {
    view.alpha = 0.0
}
  • Core Animation
let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 1.0
animation.toValue = 0.0
animation.duration = 0.5
view.layer.addAnimation(animation, forKey: "opacityAnimation")

2.14 网络和数据传输

使用 NSURLSession 可以进行网络请求和数据传输。

let url = NSURL(string: "https://example.com/api/data")!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
    if let data = data {
        // 处理返回的数据
    }
}
task.resume()

2.15 通知和广播

使用 NSNotificationCenter 可以实现应用程序内的通知和广播机制。

// 注册通知
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(handleNotification(_:)), name: "MyNotification", object: nil)

// 发送通知
NSNotificationCenter.defaultCenter().postNotificationName("MyNotification", object: nil)

// 处理通知
func handleNotification(notification: NSNotification) {
    // 处理通知事件
}

2.16 错误处理

在Swift中,可以使用 do - try - catch 语句进行错误处理。

enum MyError: ErrorType {
    case InvalidInput
}

func validateInput(input: String) throws {
    if input.isEmpty {
        throw MyError.InvalidInput
    }
}

do {
    try validateInput("")
} catch MyError.InvalidInput {
    println("输入无效")
}

2.17 性能优化

性能优化包括内存管理、代码优化和资源优化等方面。
- 内存管理 :使用自动引用计数(ARC)来管理内存。
- 代码优化 :避免不必要的循环和重复计算。
- 资源优化 :压缩图片和音频资源,减少应用程序的大小。

2.18 测试和调试

可以使用Xcode的调试工具和单元测试框架进行测试和调试。
- 调试 :使用断点和日志输出进行调试。

println("Debug message: \(variable)")
  • 单元测试 :使用XCTest框架编写单元测试。
import XCTest

class MyTests: XCTestCase {
    func testExample() {
        let result = 2 + 2
        XCTAssertEqual(result, 4, "加法结果不正确")
    }
}

2.19 应用程序发布

应用程序发布包括打包、签名和提交到App Store等步骤。
- 打包 :使用Xcode的Archive功能打包应用程序。
- 签名 :使用开发者证书和描述文件对应用程序进行签名。
- 提交 :将打包好的应用程序提交到App Store进行审核和发布。

通过以上这些技术和方法,可以开发出功能丰富、性能良好的iOS应用程序。在实际开发中,需要根据具体的需求和场景选择合适的技术和工具,不断学习和实践,提高开发水平。

3. 常见问题及解决方案

3.1 Playground运行代码问题

在编写代码时,若在Playground中运行某些代码可能无法得到正确结果,比如打印遵循 Printable 协议类型的实例时。
- 问题表现

let rect = Rectangle(width: 10, height: 20)
println(rect)    // 在Playground中可能无法正确输出
  • 解决方案 :将 println(rect) 替换为 println(rect.description) 。这是因为在编写本文时,Xcode的Playground实现存在已知问题,而在应用程序中代码可以正常工作。

3.2 自动布局约束问题

在使用自动布局约束时,可能会遇到约束冲突或布局不符合预期的情况。
- 问题表现 :界面元素位置或大小不符合设计要求,可能出现重叠、显示不全等问题。
- 解决方案
1. 检查约束代码,确保约束的属性、关系和常量设置正确。例如:

let leadingConstraint = NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1.0, constant: 20)
2. 可以使用Interface Builder的布局调试工具,查看约束冲突信息,根据提示进行调整。
3. 避免同时使用自动布局约束和自动调整大小掩码,确保`translatesAutoresizingMaskIntoConstraints`属性设置为`false`。

3.3 数据持久化问题

在进行数据持久化操作时,可能会遇到文件读写失败、数据丢失等问题。
- 问题表现
- 文件写入失败,如属性列表写入文件时无法保存数据。
- 归档模型对象时,解码或编码出现错误。
- SQLite3数据库操作失败,如创建表失败、插入数据失败等。
- 解决方案
- 文件读写问题 :检查文件路径是否正确,确保应用程序有读写该文件的权限。例如:

let plistPath = documentsDirectory.stringByAppendingPathComponent("data.plist")
let data = ["name": "John", "age": 30]
if!data.writeToFile(plistPath, atomically: true) {
    println("文件写入失败")
}
- **归档模型对象问题**:确保模型类正确实现了`NSCoding`协议的`init(coder:)`和`encodeWithCoder(_:)`方法。
- **SQLite3数据库问题**:检查SQL语句是否正确,数据库连接是否成功。例如:
import SQLite3

let dbPath = documentsDirectory.stringByAppendingPathComponent("database.sqlite")
var db: COpaquePointer = nil
if sqlite3_open(dbPath, &db) == SQLITE_OK {
    let createTableSQL = "CREATE TABLE IF NOT EXISTS Persons (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Age INTEGER);"
    if sqlite3_exec(db, createTableSQL, nil, nil, nil) != SQLITE_OK {
        println("创建表失败: \(String.fromCString(sqlite3_errmsg(db)))")
    }
    sqlite3_close(db)
}

3.4 触摸和手势识别问题

在处理触摸和手势识别时,可能会遇到手势无法识别或识别不准确的情况。
- 问题表现
- 点击手势无法触发相应的操作。
- 滑动、捏合等手势识别不准确,出现误判。
- 解决方案
1. 检查手势识别器的设置,确保目标和动作方法正确关联。例如:

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
view.addGestureRecognizer(tapGesture)

func handleTap(gesture: UITapGestureRecognizer) {
    // 处理点击手势
}
2. 检查视图的交互属性,确保视图可以接收触摸事件,`userInteractionEnabled`属性设置为`true`。
3. 调整手势识别器的属性,如`numberOfTapsRequired`、`numberOfTouchesRequired`等,以满足实际需求。

3.5 位置和地图问题

在使用Core Location和Map Kit框架时,可能会遇到位置获取失败、地图显示异常等问题。
- 问题表现
- 位置管理器无法获取设备的位置信息。
- 地图显示不完整或标记位置不准确。
- 解决方案
- 位置获取问题
1. 确保应用程序已经请求了使用位置服务的权限,调用 requestWhenInUseAuthorization() requestAlwaysAuthorization() 方法。
2. 检查设备的位置服务是否开启。
3. 处理位置管理器的错误通知,根据错误类型进行相应的处理。例如:

extension ViewController: CLLocationManagerDelegate {
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        println("位置获取失败: \(error.localizedDescription)")
    }
}
- **地图显示问题**:检查地图视图的设置,确保地图的区域、缩放级别等属性设置正确。

4. 技术总结与展望

4.1 技术总结

本文涵盖了Swift开发和iOS应用开发的多个方面,包括Swift的基础特性(子类化、协议、扩展)以及iOS应用开发的各种技术,如背景处理、数据持久化、视图和布局、触摸和手势识别、位置和地图等。通过具体的代码示例和操作步骤,详细介绍了这些技术的使用方法和常见问题的解决方案。

技术领域 关键技术点
Swift基础 子类化、协议、扩展
iOS应用开发 背景处理、数据持久化、视图和布局、触摸和手势识别、位置和地图等
常见问题解决 Playground运行问题、自动布局约束问题、数据持久化问题、触摸和手势识别问题、位置和地图问题等

4.2 技术展望

随着移动应用开发技术的不断发展,Swift和iOS应用开发也将迎来更多的机遇和挑战。
- 性能优化 :未来可能会有更多的性能优化工具和技术出现,帮助开发者进一步提高应用程序的性能,如更智能的内存管理和代码优化算法。
- 用户体验提升 :随着设备硬件的不断升级,开发者可以利用更多的新技术来提升用户体验,如增强现实(AR)、虚拟现实(VR)等技术在iOS应用中的应用。
- 跨平台开发 :虽然本文主要介绍了iOS应用开发,但跨平台开发技术也越来越受到关注,未来可能会有更多的开发者选择使用跨平台框架来开发应用程序,以提高开发效率和降低开发成本。

4.3 学习建议

对于想要学习Swift和iOS应用开发的开发者,以下是一些建议:
1. 实践出真知 :通过实际项目来练习所学的技术,不断积累经验。可以从简单的项目开始,逐步增加项目的复杂度。
2. 阅读优秀代码 :学习优秀的开源项目和代码示例,了解其他开发者的编程思路和技巧。
3. 关注技术动态 :关注Swift和iOS开发的最新技术动态和趋势,不断学习新的知识和技能。
4. 参与社区交流 :加入开发者社区,与其他开发者交流经验和心得,解决遇到的问题。

通过不断学习和实践,相信开发者可以掌握Swift和iOS应用开发技术,开发出高质量的应用程序。

mermaid格式流程图:

graph LR
    A[开始学习] --> B[学习Swift基础特性]
    B --> C[学习iOS应用开发技术]
    C --> D[实践项目]
    D --> E[解决常见问题]
    E --> F[性能优化与用户体验提升]
    F --> G[关注技术动态与跨平台开发]
    G --> H[持续学习与进步]

以上就是关于Swift开发和iOS应用开发的相关内容,希望对开发者有所帮助。在实际开发中,要不断探索和实践,结合具体需求选择合适的技术和工具,以开发出优秀的应用程序。

【3D应力敏感度分析拓扑优】【基于p-范数全局应力衡量的3D敏感度分析】基于伴随方法的有限元分析和p-范数应力敏感度分析(Matlab代码实现)内容概要:本文档介绍了基于伴随方法的有限元分析p-范数全局应力衡量的3D应力敏感度分析,并结合拓扑优技术,提供了完整的Matlab代码实现方案。该方法通过有限元建模计算结构在载荷作用下的应力分布,采用p-范数对全局应力进行有效聚合,避免传统方法中应力约束过多的问题,进而利用伴随法高效求解设计变量对应力的敏感度,为结构优提供关键梯度信息。整个流程涵盖了从有限元分析、应力评估到敏感度计算的核心环节,适用于复杂三维结构的轻量高强度设计。; 适合人群:具备有限元分析基础、拓扑优背景及Matlab编程能力的研究生、科研人员工程技术人员,尤其适合从事结构设计、力学仿真多学科优的相关从业者; 使用场景及目标:①用于实现高精度三维结构的应力约束拓扑优;②帮助理解伴随法在敏感度分析中的应用原理编程实现;③服务于科研复现、论文写作工程项目中的结构性能提升需求; 阅读建议:建议读者结合有限元理论算法知识,逐步调试Matlab代码,重点关注伴随方程的构建p-范数的数值处理技巧,以深入掌握方法本质并实现个性拓展。
下载前必看:https://pan.quark.cn/s/9f13b242f4b9 Android 平板设备远程操控个人计算机的指南 Android 平板设备远程操控个人计算机的指南详细阐述了如何运用 Splashtop Remote 应用程序达成 Android 平板设备对个人计算机的远程操控。 该指南被划分为四个环节:首先,在个人计算机上获取并部署 Splashtop Remote 应用程序,并设定客户端密码;其次,在 Android 平板设备上获取并部署 Splashtop Remote 应用程序,并之建立连接至个人计算机的通道;再次,在 Splashtop Remote 应用程序中识别已部署个人计算机端软件的设备;最后,运用平板设备对个人计算机实施远程操控。 关键点1:Splashtop Remote 应用程序的部署配置* 在个人计算机上获取并部署 Splashtop Remote 应用程序,可通过官方网站或其他获取途径进行下载。 * 部署结束后,必须输入客户端密码,该密码在平板控制计算机时用作验证,密码长度至少为8个字符,且需包含字母数字。 * 在配置选项中,能够设定是否在设备启动时自动运行客户端,以及进行互联网搜索设置。 关键点2:Splashtop Remote 应用程序的 Android 版本获取部署* 在 Android 平板设备上获取并部署 Splashtop Remote 应用程序,可通过 Google Play Store 或其他获取途径进行下载。 * 部署结束后,必须输入客户端密码,该密码用于连接至个人计算机端软件。 关键点3:运用 Splashtop Remote 远程操控个人计算机* 在 Splashtop Remote 应用程序中识别...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值