iOS新闻客户端开发教程7-新闻列表

在上教程中,我们介绍了二级导航栏的开发,今天我们来讲解iOS开发中非常常用和重要的组件:“列表”,即UITableView。本节课程将会介绍横向滚动列表和竖向滚动列表,分别来实现二级栏目滑动切换和新闻内容列表的功能。

        • UITableView介绍
        • 横向滚动列表-二级栏目滑动切换
        • 新闻内容列表

UITableView介绍

在OC中,UITableView是用来展示列表数据的控件,基本使用方法是:
1.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDataSource
2.然后 UITableView对象的 delegate要设置为 self。
3.实现这些delegate的一些方法,重写。

横向滚动列表-二级栏目滑动切换

1.新建横向滚动列表类LandscapeTableView

//LandscapeTableView.h
#import <UIKit/UIKit.h>  
#import "LandscapeCell.h"@protocol LandscapeTableViewDelegate;
@protocol LandscapeTableViewDataSource;@interface LandscapeTableView : UIView <UIScrollViewDelegat\> {// 存储页面的滚动条容器UIScrollView                *_scrollView;// 单元格之间的间隔,缺省20CGFloat                     _gapBetweenCells;// 预先加载的单元格数,在可见单元格的两边预先加载不可见单元格的数目NSInteger                   _cellsToPreload;// 单元格总数NSInteger                   _cellCount;// 当前索引NSInteger                   _currentCellIndex;// 上次选择的单元格索引NSInteger                   _lastCellIndex;// 加载当前可见单元格左边的索引NSInteger                   _firstLoadedCellIndex;// 加载当前可见单元格右边的索引NSInteger                   _lastLoadedCellIndex;// 可重用单元格控件的集合NSMutableSet                *_recycledCells;// 当前可见单元格集合NSMutableSet                *_visibleCells;// 是否正在旋转BOOL                        _isRotationing;// 页面容器是否正在滑动BOOL                        _scrollViewIsMoving;// 回收站是否可用,是否将不用的页控件保存到_recycledCells集合中BOOL                        _recyclingEnabled;
}@property(nonatomic, assign) IBOutlet id<LandscapeTableViewDataSource>    dataSource;
@property(nonatomic, assign) IBOutlet id<LandscapeTableViewDelegate>      delegate;@property(nonatomic, assign) CGFloat    gapBetweenCells;
@property(nonatomic, assign) NSInteger  cellsToPreload;
@property(nonatomic, assign) NSInteger  cellCount;
@property(nonatomic, assign) NSInteger  currentCellIndex;// 重新加载数据
- (void)reloadData;
// 由索引获得单元格控件,如果该单元格还没有加载将返回nil
- (LandscapeCell *)cellForIndex:(NSUInteger)index;
// 返回可以重用的单元格控件,如果没有可重用的,返回nil
- (LandscapeCell *)dequeueReusableCell;@end@protocol LandscapeTableViewDataSource
@required
- (NSInteger)numberOfCellsInTableView:(LandscapeTableView *)tableView;
- (LandscapeCell *)cellInTableView:(LandscapeTableView *)tableView atIndex:(NSInteger)index;@end@protocol LandscapeTableViewDelegate
@optional
- (void)tableView:(LandscapeTableView *)tableView didChangeAtIndex:(NSInteger)index;
- (void)tableView:(LandscapeTableView *)tableView didSelectCellAtIndex:(NSInteger)index;// a good place to start and stop background processing
- (void)tableViewWillBeginMoving:(LandscapeTableView *)tableView;
- (void)tableViewDidEndMoving:(LandscapeTableView *)tableView;@end

#import "LandscapeTableView.h"@interface LandscapeTableView (LandscapeTableViewPrivate) <UIScrollViewDelegate>- (void)configureCells;
- (void)configureCell:(LandscapeCell *)cell forIndex:(NSInteger)index;- (void)recycleCell:(LandscapeCell *)cell;- (CGRect)frameForScrollView;
- (CGRect)frameForCellAtIndex:(NSUInteger)index;- (void)willBeginMoving;
- (void)didEndMoving;@end@implementation LandscapeTableView#pragma mark - Lifecycle methods- (void)addContentView
{_scrollView = [[UIScrollView alloc] initWithFrame:[self frameForScrollView]];_scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;_scrollView.pagingEnabled = YES;_scrollView.backgroundColor = [UIColor whiteColor];_scrollView.showsVerticalScrollIndicator = NO;_scrollView.showsHorizontalScrollIndicator = NO;_scrollView.bounces = YES;_scrollView.delegate = self;[self addSubview:_scrollView];
}- (void)internalInit
{_visibleCells = [[NSMutableSet alloc] init];_recycledCells = [[NSMutableSet alloc] init];_currentCellIndex = -1;_lastCellIndex = 0;_gapBetweenCells = 20.0f;_cellsToPreload = 1;_recyclingEnabled = YES;_firstLoadedCellIndex = _lastLoadedCellIndex = -1;self.clipsToBounds = YES;[self addContentView];
}- (id)initWithCoder:(NSCoder *)aDecoder {if ((self = [super initWithCoder:aDecoder])) {[self internalInit];}return self;
}- (id)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {[self internalInit];}return self;
}- (void)dealloc
{self.delegate = nil;self.dataSource = nil;
}- (void)layoutSubviews
{if (_isRotationing)return;CGRect oldFrame = _scrollView.frame;CGRect newFrame = [self frameForScrollView];if (!CGRectEqualToRect(oldFrame, newFrame)) {// Strangely enough, if we do this assignment every time without the above// check, bouncing will behave incorrectly._scrollView.frame = newFrame;}if (oldFrame.size.width != 0 && _scrollView.frame.size.width != oldFrame.size.width) {// rotation is in progress, don't do any adjustments just yet} else if (oldFrame.size.height != _scrollView.frame.size.height) {// some other height change (the initial change from 0 to some specific size,// or maybe an in-call status bar has appeared or disappeared)[self configureCells];}
}#pragma mark - Propertites methods- (void)setGapBetweenCells:(CGFloat)value
{_gapBetweenCells = value;[self setNeedsLayout];
}- (void)setPagesToPreload:(NSInteger)value
{_cellsToPreload = value;[self configureCells];
}- (void)setCurrentCellIndex:(NSInteger)newCellIndex
{if (_scrollView.frame.size.width > 0 && fabs(_scrollView.frame.origin.x - (-_gapBetweenCells/2)) < 1e-6) {_scrollView.contentOffset = CGPointMake(_scrollView.frame.size.width * newCellIndex, 0);}_currentCellIndex = newCellIndex;_lastCellIndex = _currentCellIndex;
}- (NSInteger)firstVisibleCellIndex
{CGRect visibleBounds = _scrollView.bounds;return MAX(floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds)), 0);
}- (NSInteger)lastVisibleCellIndex
{CGRect visibleBounds = _scrollView.bounds;return MIN(floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds)), _cellCount - 1);
}#pragma mark - Utility methods- (void)reloadData
{_cellCount = [_dataSource numberOfCellsInTableView:self];// recycle all cellsfor (LandscapeCell *cell in _visibleCells) {[self recycleCell:cell];}[_visibleCells removeAllObjects];[self configureCells];
}- (LandscapeCell *)cellForIndex:(NSUInteger)index
{for (LandscapeCell *cell in _visibleCells) {if (cell.tag == index)return cell;}return nil;
}- (LandscapeCell *)dequeueReusableCell
{LandscapeCell *result = [_recycledCells anyObject];if (result) {[_recycledCells removeObject:result];}return result;
}#pragma mark - FZPageViewPrivate methods- (void)configureCells
{if (_scrollView.frame.size.width <= _gapBetweenCells + 1e-6)return;  // not our time yetif (_cellCount == 0 && _currentCellIndex > 0)return;  // still not our time// normally layoutSubviews won't even call us, but protect against any other calls too (e.g. if someones does reloadPages)if (_isRotationing)return;// to avoid hiccups while scrolling, do not preload invisible pages temporarilyBOOL quickMode = (_scrollViewIsMoving && _cellsToPreload > 0);CGSize contentSize = CGSizeMake(_scrollView.frame.size.width * _cellCount+2, _scrollView.frame.size.height);if (!CGSizeEqualToSize(_scrollView.contentSize, contentSize)) {_scrollView.contentSize = contentSize;_scrollView.contentOffset = CGPointMake(_scrollView.frame.size.width * _currentCellIndex, 0);}CGRect visibleBounds = _scrollView.bounds;NSInteger newCellIndex = MIN(MAX(floorf(CGRectGetMidX(visibleBounds) / CGRectGetWidth(visibleBounds)), 0), _cellCount - 1);newCellIndex = MAX(0, MIN(_cellCount, newCellIndex));// calculate which pages are visibleNSInteger firstVisibleCell = self.firstVisibleCellIndex;NSInteger lastVisibleCell  = self.lastVisibleCellIndex;NSInteger firstCell = MAX(0,            MIN(firstVisibleCell, newCellIndex - _cellsToPreload));NSInteger lastCell  = MIN(_cellCount-1, MAX(lastVisibleCell,  newCellIndex + _cellsToPreload));// recycle no longer visible cellsNSMutableSet *cellsToRemove = [NSMutableSet set];for (LandscapeCell *cell in _visibleCells) {if (cell.tag < firstCell || cell.tag > lastCell) {[self recycleCell:cell];[cellsToRemove addObject:cell];}}[_visibleCells minusSet:cellsToRemove];// add missing cellsfor (NSInteger index = firstCell; index <= lastCell; index++) {if ([self cellForIndex:index] == nil) {// only preload visible pages in quick modeif (quickMode && (index < firstVisibleCell || index > lastVisibleCell))continue;LandscapeCell *cell = [_dataSource cellInTableView:self atIndex:index];[self configureCell:cell forIndex:index];[_scrollView addSubview:cell];[_visibleCells addObject:cell];}}// update loaded cells infoBOOL loadedCellsChanged = NO;if (quickMode) {// Delay the notification until we actually load all the promised pages.// Also don't update _firstLoadedPageIndex and _lastLoadedPageIndex, so// that the next time we are called with quickMode==NO, we know that a// notification is still needed.//loadedCellsChanged = NO;} else {loadedCellsChanged = (_firstLoadedCellIndex != firstCell || _lastLoadedCellIndex != lastCell);if (loadedCellsChanged) {_firstLoadedCellIndex = firstCell;_lastLoadedCellIndex  = lastCell;}}// update current cell indexBOOL cellIndexChanged = (newCellIndex != _currentCellIndex);if (cellIndexChanged) {_lastCellIndex = _currentCellIndex;_currentCellIndex = newCellIndex;if ([(NSObject *)_delegate respondsToSelector:@selector(tableView:didChangeAtIndex:)])[_delegate tableView:self didChangeAtIndex:_currentCellIndex];}
}- (void)configureCell:(LandscapeCell *)cell forIndex:(NSInteger)index
{cell.tag = index;cell.frame = [self frameForCellAtIndex:index];[cell setNeedsDisplay];
}// It's the caller's responsibility to remove this cell from _visiblePages,
// since this method is often called while traversing _visibleCells array.
- (void)recycleCell:(LandscapeCell *)cell
{if ([cell respondsToSelector:@selector(prepareForReuse)]) {[cell performSelector:@selector(prepareForReuse)];}if (_recyclingEnabled) {[_recycledCells addObject:cell];}[cell removeFromSuperview];
}- (CGRect)frameForScrollView
{CGSize size = self.bounds.size;return CGRectMake(-_gapBetweenCells/2, 0, size.width + _gapBetweenCells, size.height);
}- (CGRect)frameForCellAtIndex:(NSUInteger)index
{CGFloat cellWidthWithGap = _scrollView.frame.size.width;CGSize cellSize = self.bounds.size;return CGRectMake(cellWidthWithGap * index + _gapBetweenCells/2,0, cellSize.width, cellSize.height);
}- (void)willBeginMoving
{if (!_scrollViewIsMoving) {_scrollViewIsMoving = YES;if ([(NSObject *)_delegate respondsToSelector:@selector(tableViewWillBeginMoving:)]) {[_delegate tableViewWillBeginMoving:self];}}
}- (void)didEndMoving
{if (_scrollViewIsMoving) {_scrollViewIsMoving = NO;if (_cellsToPreload > 0) {// we didn't preload invisible cells during scrolling, so now is the time[self configureCells];}if ([(NSObject *)_delegate respondsToSelector:@selector(tableViewDidEndMoving:)]) {[_delegate tableViewDidEndMoving:self];}if (_lastCellIndex != _currentCellIndex) {LandscapeCell *cell = [self cellForIndex:_lastCellIndex];cell.frame = cell.frame;}}
}#pragma mark -
#pragma mark UIScrollViewDelegate methods- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{if (_scrollView == scrollView) {if (_isRotationing)return;[self configureCells];}
}- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{if (_scrollView == scrollView) {[self willBeginMoving];}
}- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{if (!decelerate && _scrollView == scrollView) {[self didEndMoving];}
}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{if (_scrollView == scrollView) {[self didEndMoving];}
}@end

2.横向滚动单元格TableCell
新建NewsLandscapeCell

//NewsLandscapeCell.h
#import "LandscapeCell.h"
#import "NewsWidget.h"@interface NewsLandscapeCell : LandscapeCell {NewsWidget  *_widget;
}@end
//NewsLandscapeCell.m
#import "NewsLandscapeCell.h"
#import "ColumnInfo.h"
@implementation NewsLandscapeCell- (void)setCellData:(ColumnInfo *)info
{[super setCellData:info];if (_widget == nil) {_widget = [[NewsWidget alloc] init];_widget.columnInfo = info;_widget.owner = self.owner;_widget.view.frame = self.bounds;[self addSubview:_widget.view];}else {_widget.columnInfo = info;[_widget reloadData];}
}@end

3.实现二级栏目导航横向滚动切换

//NewsController.h
IBOutlet LandscapeTableView   *_tableView;
//NewsController.m
#pragma mark - LandscapeViewDataSource & LandscapeViewDelegate methods- (NSInteger)numberOfCellsInTableView:(LandscapeTableView *)tableView
{return _barWidget.listData.count;
}- (LandscapeCell *)cellInTableView:(LandscapeTableView *)tableView atIndex:(NSInteger)index
{NewsLandscapeCell *cell = (NewsLandscapeCell *)[tableView dequeueReusableCell];if (cell == nil) {cell = [[NewsLandscapeCell alloc] initWithFrame:_tableView.bounds];cell.owner = self;}ColumnInfo *info = [_barWidget.listData objectAtIndex:index];[cell setCellData:info];return cell;
}- (void)tableView:(LandscapeTableView *)tableView didChangeAtIndex:(NSInteger)index
{_barWidget.pageIndex = index;
}

新闻内容列表

1.新建新闻列表视图xib,NewsWidget

2.拖拽UITableView控件
这里写图片描述

3.设置约束,自适应父视图
这里写图片描述

4.新建xib类,NewsWidget

//NewsWidget.h
#import "TableWidget.h"
#import "ColumnInfo.h"
@interface NewsWidget : TableWidget{BOOL        _hasNextPage;NSInteger   _pageIndex;
}@property(nonatomic, strong) ColumnInfo   *columnInfo;@end
//NewsWidget.m
#import "NewsWidget.h"
#import "GetNews.h"
#import "BaseCell.h"@implementation NewsWidget- (void)viewDidLoad
{self.cellIdentifier = @"NewsCell";_cellHeight = 80;_pageIndex = 0;_hasNextPage = NO;self.listData = [[NSMutableArray alloc] init];[super viewDidLoad];
}- (void)reloadData
{// 停止网络请求[_operation cancelOp];_operation = nil;_pageIndex = 0;// 先清除上次内容[self.listData removeAllObjects];[super reloadData];
}- (BOOL)isReloadLocalData
{//NSArray *datas = [FxDBManager fetchNews:self.columnInfo.ID];//[self.listData addObjectsFromArray:datas];return [super isReloadLocalData];
}- (void)requestServerOp
{NSString *url = [NSString stringWithFormat:NewsURLFmt,self.columnInfo.ID];NSDictionary *dictInfo = @{@"url":url,@"body":self.columnInfo.ID,};_operation = [[GetNews alloc] initWithDelegate:self opInfo:dictInfo];[_operation executeOp];
}- (void)requestNextPageServerOp
{NSString *url = [NSString stringWithFormat:NewsURLFmt,self.columnInfo.ID];NSString *body = [NSString stringWithFormat:@"pageindex=%@",@(_pageIndex)];NSDictionary *dictInfo = @{@"url":url,@"body":body};_operation = [[GetNews alloc] initWithDelegate:self opInfo:dictInfo];[_operation executeOp];
}- (void)opSuccess:(NSArray *)data
{_hasNextPage = YES;_operation = nil;if (_pageIndex == 0) {[self.listData removeAllObjects];}_pageIndex++;[self.listData addObjectsFromArray:data];[self updateUI];[self hideIndicator];
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return indexPath.row < self.listData.count ? _cellHeight:44;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return _hasNextPage?self.listData.count+1:self.listData.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{NSString *cellIdentifier = nil;BaseInfo *info = nil;if (indexPath.row < self.listData.count) {cellIdentifier = self.cellIdentifier;info = [self.listData objectAtIndex:indexPath.row];}else {cellIdentifier = @"NewsMoreCell";[self requestNextPageServerOp];}BaseCell *cell = (BaseCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];if (cell == nil) {NSArray* Objects = [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:tableView options:nil];cell = [Objects objectAtIndex:0];[cell initCell];}[cell setCellData:info];return cell;
}
@end

5.设置NewsWidget.xib的File’s owner为NewsWidget
6.新建列表item的TableCell,NewsCell.xib
7.拖拽UIImageView和2个UILabel,分别用来显示缩略图,标题和新闻摘要
这里写图片描述
8.设置服务器新闻数据,为了方便,我们分别用news_序号来代表每个栏目返回的数据,例如,news_1.json代表第一个栏目数据,news_2.json为第二个栏目,以此类推。

//news_1.json
{"result":"ok","data":[{"id":"AUL8RO0H00014JB6","name":"日众议院表决通过新安保法案","desc":"在反对声中通过新安保法案,将提交参议院审议。","iconurl":"http://img5.cache.netease.com/3g/2015/7/16/2015071609154377b2d.jpg","contenturl":"http://3g.163.com/news/15/0716/13/AUL8RO0H00014JB6.html"},{"id":"AUKG45I500014AED","name":"深圳企业水源保护区建练车场","desc":"事发地毗邻深圳水库,工程未经批复公司入场抢建。","iconurl":"http://img4.cache.netease.com/3g/2015/7/16/201507160855254aa19.jpg","contenturl":"http://3g.163.com/news/15/0716/06/AUKG45I500014AED.html"},{"id":"AUKRS19T0001124J","name":"曝公安部已确定恶意做空对象","desc":"上海个别贸易公司成调查的对象,数千家公司惶恐。","iconurl":"http://img6.cache.netease.com/3g/2015/7/16/201507160943494a1da.jpg","contenturl":"http://3g.163.com/news/15/0716/09/AUKRS19T0001124J.html"},{"id":"3","name":"唐七《三生三世》涉嫌抄袭","desc":"唐七直言被黑,大风则感慨:有人叫抄袭,有人叫模仿","iconurl":"http://img5.cache.netease.com/3g/2015/7/7/20150707155751b64ea.jpg","contenturl":"http://3g.163.com/ent/15/0707/15/ATUBLOMC00031GVS.html"},{"id":"4","name":"张晋带女儿上街 蔡少芬\"吃醋\"","desc":"张晋一手牵大女儿一手拖小女儿,蔡少芬吐槽:那我呢?","iconurl":"http://img5.cache.netease.com/3g/2015/7/7/20150707153619a6fc6.jpg","contenturl":"http://3g.163.com/ntes/15/0707/15/ATUBEV3400963VRR.html"},{"id":"5","name":"唐七《三生三世》涉嫌抄袭","desc":"唐七直言被黑,大风则感慨:有人叫抄袭,有人叫模仿","iconurl":"http://img5.cache.netease.com/3g/2015/7/7/20150707155751b64ea.jpg","contenturl":"http://3g.163.com/ent/15/0707/15/ATUBLOMC00031GVS.html"},{"id":"6","name":"张晋带女儿上街 蔡少芬\"吃醋\"","desc":"张晋一手牵大女儿一手拖小女儿,蔡少芬吐槽:那我呢?","iconurl":"http://img5.cache.netease.com/3g/2015/7/7/20150707153619a6fc6.jpg","contenturl":"http://3g.163.com/ntes/15/0707/15/ATUBEV3400963VRR.html"},{"id":"7","name":"唐七《三生三世》涉嫌抄袭","desc":"唐七直言被黑,大风则感慨:有人叫抄袭,有人叫模仿","iconurl":"http://img5.cache.netease.com/3g/2015/7/7/20150707155751b64ea.jpg","contenturl":"http://3g.163.com/ent/15/0707/15/ATUBLOMC00031GVS.html"}]
}

9.运行程序,cmd+R,如下图,即表示我们新闻列表页开发好了。
这里写图片描述
这里写图片描述

github源码:https://github.com/tangthis/NewsReader
个人技术分享微信公众号,欢迎关注一起交流
个人技术分享微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64406.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议 (图)

(AndroidIOS)正在做一个新闻App,做的差不多了,听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布(Android和IOS版本)前听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布前听听大家的建议!

iOS 摸鱼周报 #83 | ChatGPT 的风又起来了

本期概要 本期话题&#xff1a;各大搜索引擎开始接入类 ChatGPT 功能本周学习&#xff1a;Python 中的匿名函数与闭包内容推荐&#xff1a;iOS 越狱检测、获取虚拟内存状态、使用 KeyChain 进行持久化等内容摸一下鱼&#xff1a;Stable Diffusion 功能尝鲜&#xff1b;关于技术…

编程和数学是什么关系?编程学习为什么会这么火呢?

近两年&#xff0c;编程学习成为了一个热门话题&#xff0c;其热度不亚于之前的奥数&#xff0c;为什么突然会有这么多人想要学编程&#xff0c;其中不限于互联网从业者&#xff0c;而更多是中小学学生&#xff0c;那么&#xff0c;今天悉之君就带大家一探究竟。 什么是编程&a…

计算机编程数学英语不好怎么办,英语和数学不好的人是不是学不会编程?

原标题&#xff1a;英语和数学不好的人是不是学不会编程&#xff1f; 收到很多咨询的留言&#xff0c;学生总是会问&#xff1a; “我成绩不好&#xff0c;能学好编程吗&#xff1f;” “我数学不好是不是代表逻辑思维不行&#xff1f;” “我英语都不及格&#xff0c;那么多单…

用编程学数学:让数学不枯燥,让编程不神秘!

许多人总爱问&#xff1a;编程那么难&#xff0c;能学好吗&#xff0c;或者学编程到底能干啥&#xff1f;等等诸如此类的问题。 但是&#xff0c;其实编程并没有大家想象中的那么难&#xff0c;编程要培养的也只是一项基础的思维逻辑。 编程所需要的很多能力和数学是相通的。…

为什么人人都学Python,讲清楚了,只要初中数学基础你就可以编程

Python越来越热&#xff0c;随着大数据和人工智能的兴起&#xff0c;Python将会继续热。 2022年7月&#xff0c;Python依旧占据Tiobe榜首位置&#xff0c;属实是“霸榜”编程语言。 不仅如此&#xff0c;Python在其他排行榜中&#xff0c;也是常年占据榜首或者前列位置&#…

编程用不到微积分,可我们为什么还要学数学?

数学对于一位程序员到底意味着什么呢&#xff1f; 先跟你分享一个关于 Google 面试题的故事&#xff1a; 2004 年的某天&#xff0c;硅谷的交通动脉 101 公路上突然出现了一块巨大的广告牌&#xff0c;上面是一道数学题&#xff1a;{e 的连续数字中最先出现的 10 位质数}.com。…

数学不好能学好编程吗?你来告诉你

诚然&#xff0c;编程离不开数学&#xff0c;或者可以说数学是任何科学的基础&#xff0c;但这不意味着在开始学习编程之前必须对数学很在行或者数学分数很高&#xff0c;那我们今天就来讨论下数学与编程的关系。 首先&#xff0c;如果想要能够进行基本的编程&#xff0c;哪些数…

分享:作为程序员,为什么你应该学好数学?

你好&#xff0c;我是黄申&#xff0c;目前在 LinkedIn 从事数据科学的工作&#xff0c;主要负责全球领英的搜索引擎优化&#xff0c;算法和数据架构的搭建。 2006 年&#xff0c;我博士毕业于上海交通大学计算机科学与工程专业&#xff0c;在接下来十余年时间里&#xff0c;我…

没有数学基础可以学编程吗?

一、为什么学编程 这里我并不是问大家&#xff0c;是因为兴趣啊还是就业学编程。 而是&#xff0c;我想要学Python为了量化交易&#xff0c;或者我要处理表格。我想要学Java我就想自己建站。是否有这种非常明确的目标&#xff0c;有目标才能明确学习路线。 如果在这里&#…

只有1%的人才知道的ChatGPT写作技巧

随意的提示只能产出糟糕的输出&#xff0c;要想让ChatGPT输出高质量内容&#xff0c;需要一些技巧。原文: Stop doing this on ChatGPT and get ahead of the 99% of its users[1] 如果你尝试过用ChatGPT写作&#xff0c;也许会对AI生成的内容感到沮丧&#xff0c;也许认为Chat…

边锋网络入选2019中国互联网企业100强榜单

【TechWeb】8月14日消息&#xff0c;中国互联网协会、工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心&#xff09;今日发布了2019年中国互联网企业100强榜单&#xff0c;杭州边锋网络技术有限公司&#xff08;下文简称边锋网络&#xff09;入选。 边锋…

【关于2022年卡塔尔世界杯】

2022卡塔尔世界杯最全面的看点和分析,相信一定有你感兴趣的一点,相信一定会有你感兴趣的,推荐点赞收藏~~ 2022年世界杯比以往任何时候都晚,因为卡塔尔太热了…… 然而,四年一度的世界杯终于……来了 今年的世界杯,你最期待什么? 你认为谁会成为今年的冠军? 和小文一…

数据趣事:豪掷2200亿美元举办的世界杯有多精彩!世界杯趣事你知道哪些

2022卡塔尔世界杯正如火如荼的进行着&#xff0c;此次的卡塔尔世界杯也是中东和阿拉伯地区首次举办&#xff0c;为此卡塔尔更是豪掷2200亿美元&#xff0c;远超历届主办国。 本届世界杯共有32支来自不同国家的队伍&#xff0c;他们都有一个共同的奋斗目标——捧起大力神杯&…

中国20强(上市)游戏公司2022年财报分析:营收结构优化,市场竞争进入白热化

易观&#xff1a;受全球经济增速下行的消极影响&#xff0c;2022年国内外游戏市场规模普遍下滑。但中国游戏公司凭借处于全球领先水平的研发、发行和运营的能力与经验&#xff0c;继续加大海外市场布局&#xff0c;推动高质量发展迈上新台阶。 风险提示&#xff1a;本文内容仅代…

盛大边锋总裁许朝军离职创业正组建团队

2月15日消息&#xff0c;盛大边锋总裁许朝军今日向腾讯科技证实自己已离职创业&#xff0c;创业选择的方向是移动互联网&#xff0c;目前正在组建团队开发产品。许朝军还在腾讯微博中感叹&#xff1a;“成功是偶然&#xff0c;失败是必然。但是自己要开始惊险一跳!” 据了解&am…

摊牌了,.NET开发者,准备赋能未来

hi&#xff0c;这里是桑小榆。一名.net开发&#xff0c;从19年毕业至今一直从事相关技术已近4年。 发展至今&#xff0c;很有必要分享分享我的经历以及对于.net开发的看法和见解。 篇幅有些长&#xff0c;无论你是学生&#xff0c;职业人&#xff0c;.NET开发者还是其他语言开发…

边锋游戏:用精细化运营使游戏流失率降低 26% ,只是数据驱动价值的冰山一角...

如今&#xff0c;我国游戏行业市场受限于监管政策&#xff0c;增速放缓。同时&#xff0c;随着市场流量的僵化&#xff0c;同质化严重&#xff0c;竞争激烈程度只增不减&#xff0c;粗放的推广方式也已成历史&#xff0c;数据驱动精细化运营逐渐成为企业焦点。 已知的众多成功案…

边锋浩方35亿易主浙报传媒:陈天桥获益近29亿

盛大网络董事长兼CEO陈天桥&#xff08;TechWeb配图&#xff09; ▲陈天桥投资边锋与浩方&#xff0c;8年总共获得收益28.63亿。 边锋浩方35亿易主&#xff1a;盛大瘦身 浙报增肥 借壳上市仅半年的浙报传媒&#xff0c;昨日抛出大举动公告&#xff0c;拟斥资34.9亿元收购刚从…

边锋围棋-基于英特尔®实感技术的应用案例

&#xfeff;&#xfeff; 面临挑战 为用户提供更加优秀的娱乐视频互动体验 用户通过游戏视频过程中&#xff0c;需要环境隐私的保护 解决方案 基于英特尔实感TM技术对用户进行面部捕捉与识别 基于英特尔实感TM技术摄像头用户可以自定义视频过程中的背景 影响 满足用户对…