如何把NSStringios id类型转nsstring化成CGFloat类型

17:39 提问
ios swift string 类型转化为CGfloat给CGRectMake
var currentNodeName:String!
func parser(parser: NSXMLParser, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!)
currentNodeName = elementName
if elementName=="background"
let stringx = attributeDict["x"]! as String
//if let n = NSNumberFormatter().numberFromString(stringx)
let x = CGFloat(n)
//var y = attributeDict["y"]! as CGFloat
//var width = attributeDict["width"]! as CGFloat
var Height = attributeDict["Height"]! as String
backgroundRect = CGRectMake(0,0,0,0)
从xml里面读出来都是string,怎么转换呢?
按赞数排序
自己找到解决办法了,
let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
m_backgroundRect = CGRectMake(x,y,Width,Height)
let floatValue = Float(stringValue)
3042关注|460收录
其他相似问题&>&&>&&有关于"" 的文章列表
从Objective-C向Swift转换学习到的经验
摘要: SendBird是国外一款针对移动App和网站的Chat API,其开发团队成员Jed Gyeong分享了他们在将产品从Objective-C向Swift转换过程中所学习到的一些心得体会。SendBird为常见系统均提供了示例UI,方便开发者构建自己的聊天和短信功能。以前只有Objective-C的iOS示例UI,后来听到诸多要求开发Swift版本的呼声,于是我们将示例UI的语言从Objective-C转换成了Swift。此过程中的最大感受是:两种语言确实存在不少差异。今天特意分享一些心得给大家,希望对你们有借鉴价值。注意:示例UI并不使用Interface Builder(IB,Mac OS X平台上用于设计和测试用户界面的应用程序),而是从零开始构建的。所以以下范例不适用于使用Interface Builder的开发者。Objective-C和Swift语言示例项目SendBird示例UI可从Github库下载。Objective-C和Swift语言项目均在同一个库中,我们建议比较两种代码库以更好理解其差异。初始化UIView的子类在iOS应用上实现UI就需要子类化UIView,也就是要重写UIView的init方法。注意:两种语言有所区别。Objective-C只需在UIView子类中重写必要的init方法。要初始化一个UIView框架,就要重写initWithFrame:框架,如下所示:@implementation SubUIView- (id) initWithFrame:(CGRect)frame{& & self = ;& & if (self != nil) {& & & & // ...& & }& &}@end然而Swift需要多一些步骤来重写同一个init方法。首先,重写使用CGRect框架作为其参数的init方法。根据UIView文档,用Swift语言构建时,须重写init(coder:),但我们不需要这种方法,就用如下代码处理。类属性初始化所需的代码可以在init(frame:)中执行。class SubUIView: UIView {& & override init(frame: CGRect) {& & & & super.init(frame: frame)& & & & // ...& & }& & required init?(coder aDecoder: NSCoder) {& & & & fatalError(&init(coder:) has not been implemented&)& & }}初始化UIViewController的子类子类化UIViewController是iOS开发的重要步骤。使用Interface Builder的开发者需要重写initWithNibName:bundle:,但既然我们用代码来构建UI,就不需要执行这一方法了。只需重写init方法,在其中初始化类属性即可。@implementation SubUIViewController- (id) init{& & self = ;& & if (self != nil) {& & & & // ...& & }& &}@endSwift也一样要重写init()方法。实现指定的初始化init(nibName:bundle:)来子类化UIViewController。重申:此过程不适用Interface Builder,所以无需定义nibName和bundle的值,而是调用比指定初始化更简单的convenience初始化,将指定初始化init(nibName:bundle:)设为零。现在调用init()来初始化类,用重写的(nibName:bundle:)执行类属性。class SubUIViewController: UIViewController {& & convenience init() {& & & & self.init(nibName: nil, bundle: nil)& & }& & override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {& & & & super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)& & & & // Initialize properties of class& & } &&& & required init?(coder aDecoder: NSCoder) {& & & & fatalError(&init(coder:) has not been implemented&)& & }}现在可以创建和调用UIViewController的子类,如下所示:let viewController: SubUIViewController = SubUIViewController()self.navigationController?.pushViewController(viewController, animated: false)使用Auto Layout来实现View没有Interface Builder的情况下,就用Auto Layout中的NSLayoutConstraint类来设置View的大小和位置——注意Objective-C和Swift在这里有微妙差别。Objective-C使用NSLayoutConstraint类中的constraintWithItem方法。+ (instancetype)constraintWithItem:(id)view1& & & & & & & & & & & & &attribute:(NSLayoutAttribute)attr1& & & & & & & & & & & & &relatedBy:(NSLayoutRelation)relation& & & & & & & & & & & & & & toItem:(id)view2& & & & & & & & & & & & &attribute:(NSLayoutAttribute)attr2& & & & & & & & & & & & multiplier:(CGFloat)multiplier& & & & & & & & & & & & & constant:(CGFloat)cSwift使用同一个类中的init方法。convenience init(item view1: AnyObject,& & & &attribute attr1: NSLayoutAttribute,& & & &relatedBy relation: NSLayoutRelation,& & & & & toItem view2: AnyObject?,& & & &attribute attr2: NSLayoutAttribute,& & & multiplier multiplier: CGFloat,& & & & constant c: CGFloat)如果是Objective-C,则执行以下代码。这段代码将创建NSLayoutConstraint(定义self.profileImageView和self之间的位置),然后添加到self上。];使用Swift也可以创建NSLayoutConstraint,具体如下:self.addConstraint(NSLayoutConstraint.init(item: self.profileImageView!, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: kMessageCellLeftMargin))比较两种语言版本你会发现,不同于Objective-C,Swift是从NSLayoutConstraint调用init方法的,而且属性和relatedBy的枚举值也有差别。两种语言NSLayoutConstraint中的枚举值分别是:NSLayoutAttributeObjective-Ctypedef enum: NSInteger {& &NSLayoutAttributeLeft = 1,& &NSLayoutAttributeRight,& &NSLayoutAttributeTop,& &NSLayoutAttributeBottom,& &NSLayoutAttributeLeading,& &NSLayoutAttributeTrailing,& &NSLayoutAttributeWidth,& &NSLayoutAttributeHeight,& &NSLayoutAttributeCenterX,& &NSLayoutAttributeCenterY,& &NSLayoutAttributeBaseline,& &NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline,& &NSLayoutAttributeFirstBaseline,& &NSLayoutAttributeLeftMargin,& &NSLayoutAttributeRightMargin,& &NSLayoutAttributeTopMargin,& &NSLayoutAttributeBottomMargin,& &NSLayoutAttributeLeadingMargin,& &NSLayoutAttributeTrailingMargin,& &NSLayoutAttributeCenterXWithinMargins,& &NSLayoutAttributeCenterYWithinMargins,& &NSLayoutAttributeNotAnAttribute = 0} NSLayoutASwiftenum NSLayoutAttribute : Int {& & case Left& & case Right& & case Top& & case Bottom& & case Leading& & case Trailing& & case Width& & case Height& & case CenterX& & case CenterY& & case Baseline& & static var LastBaseline: NSLayoutAttribute { get }& & case FirstBaseline& & case LeftMargin& & case RightMargin& & case TopMargin& & case BottomMargin& & case LeadingMargin& & case TrailingMargin& & case CenterXWithinMargins& & case CenterYWithinMargins& & case NotAnAttribute}NSLayoutRelationObjective-Cenum {& &NSLayoutRelationLessThanOrEqual = -1,& &NSLayoutRelationEqual = 0,& &NSLayoutRelationGreaterThanOrEqual = 1,};typedef NSInteger NSLayoutRSwiftenum NSLayoutRelation : Int {& & case LessThanOrEqual& & case Equal& & case GreaterThanOrEqual}选择器使用UIButton、NSNotificationCenter、NSTimer等时,使用选择器来分配要执行的方法。在Objective-C中,@selector指令代表使用选择器。- (void)test{& & // ...& & mTimer = ;}- (void)timerCallback:(NSTimer *)timer{& & // ...}在Swift中,不需要使用指令或字符串来分配方法。func test() {& & // ...& & self.mTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: &timerCallback:&, userInfo: nil, repeats: true)& & // ...}func timerCallback(timer: NSTimer) {& & // ...}字符串尽管在Swift代码中也可以用Objective-C专门处理字符串的NSString,但要使用以String对象为属性的UITextField上的文本或其他的话,就要清楚NSString和String的区别。在Objective-C中,UITextField上的文本为NSString,所以属性的长度就是字符串的长度。- (BOOL)textFieldShouldReturn:(UITextField *)textField{& & NSString *message = ;& & if ( & 0) {& & & & // ...& & }& & return YES;}Swift是没有长度属性的,所以要用characters属性的count属性。func textFieldShouldReturn(textField: UITextField) -& Bool {& & let message: String = textField.text!& & if message.characters.count & 0 {& & & & // ...& & }& & return true}在Objective-C中,我们用stringWithFormat:来创建一个格式化字符串。];但在Swift中,String里没有stringWithFormat方法,所以用init(format:_ arguments:)代之。我们可以分配一个与NSString格式化结构相同的格式化字符串来创建一个新字符串,然后给arguments赋以相关的值。self.typingLabel?.text = String.init(format: &%d Typing something cool...&, count)从数据类型得到最小&最大值就从数字格式上得到最小和最大值而言,Objective-C和Swift也有差别。Objective-C使用一个预定义宏来得到最小和最大值,但Swift则可以直接从数据类型上得到这些值。Objective-C使用的是如下的宏:CGFLOAT_MAXCGFLOAT_MININT32_MAXINT32_MINLLONG_MAXLLONG_MIN而Swift则从数据类型上得到最小和最大值,如下:CGFloat.maxCGFloat.minInt32.maxInt32.minInt64.maxInt64.min字典和枚举值Objective-C用NSDictionary来定义NSAttributedString的属性。Swift则用Dictionary而不是NSDictionary,但想为Dictionary分配枚举值的时候,做法稍有不同。Objective-C直接为NSDictionary分配键值,如下所示:称为NSUnderlineStyleSingle的枚举值不能作为NSDictionary值直接分配,所以要先用@()将它转换成一个对象。NSDictionary *underlineAttribute = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};Swift可以直接为Dictionary分配键值(如下所示)。如果该值定义为AnyObject,那么Swift就跟Objective-C一样不能直接使用枚举值,而是使用rawValue属性代之。let underlineAttribute:
= 其他心得下表列出了SendBird示例UI项目语言转换过程中所发现的Objective-C和Swift的其他差异。结论相比Objective-C,Swift有更为严格的类型转换原则,就算有Xcode的自动纠正功能也须严格遵守;学习类指定初始化和convenience初始化可以让语言转化更轻松一些;Xcode的自动代码补全和纠正让Objective-C到Swift的转换更方便,但太依赖这一功能并不能让你一劳永逸,还是以Swift的语言指南(Language Guide)为准;即使使用相同名称的类,也会在两种语言中遇到针对同一功能的不同方法名称,所以以类参考文件为准比较保险。如果决定使用Swift,建议先学习其基本知识,并试着将手头现有的Objective-C项目转化为Swift版本练练手。英文来源:Lessons Learned from Converting Objective-C Project into Swift Language&作者:Jed Gyeong&翻译:张新慧&审校/责任编辑:唐小引,欢迎技术投稿、约稿,给文章纠错,请邮件SDCC 2016 数据库&架构技术峰会(上海站)将于3月18日-19日举行,讲师和议题已全部确认。目前6折限时报名,团购享有更多优惠!详情请戳「阅读原文」如何把NSString类型转化成CGFloat类型_百度知道IOS开发中的CGFloat、CGPoint、CGSize和CGRect_博看文思吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:726贴子:
IOS开发中的CGFloat、CGPoint、CGSize和CGRect
1、数据类型:CGFloat: 浮点值的基本类型CGPoint: 表示一个二维坐标系中的点CGSize: 表示一个矩形的宽度和高度CGRect: 表示一个矩形的位置和大小typedef float CGF// 32-bittypedef double CGF// 64-bitstruct CGPoint {
CGF};typedef struct CGPoint CGPstruct CGSize {
CGF};typedef struct CGSize CGSstruct CGRect {
CGS};typedef struct CGRect CGR注意:CGRect数据结构的高度和宽度可以是负数。例如,一个矩形的原点是[0.0,0.0]和大小是[10.0,10.0]。这个矩形完全等同原点是[10.0,10.0]和大小是[-10.0,-10.0]的矩形。2、使用值来创建几何元素的方法CGPointMakeCGRectMakeCGSizeMakeCGPoint CGPointMake (
CGFloat x,
CGFloat y);CGSize CGSizeMake (
CGFloat width,
CGFloat height);CGRect CGRectMake (
CGFloat x,
CGFloat y,
CGFloat width,
CGFloat height);
CGFloat ten=10.0f;
CGPoint point = CGPointMake(0.0f, 0.0f);
CGSize size = CGSizeMake(10.0f, 10.0f);
CGRect rect = CGRectMake(point.x, point.y, size.width, size.height);
NSLog(@"ten: %f", ten);
NSLog(@"point: %@", NSStringFromCGPoint(point));
NSLog(@"size: %@", NSStringFromCGSize(size));
NSLog(@"rect: %@", NSStringFromCGRect(rect));
软件测试根据课时定,低至9元/课时.本月可免费试学7天软件测试一般4-8周可掌握.名企就业!
你是博看文思的老师吗
贴吧热议榜
使用签名档&&
保存至快速回贴Objective-C基本数据类型 - 简书
下载简书移动应用
写了34125字,被208人关注,获得了223个喜欢
Objective-C基本数据类型
Objective-C基本数据类型
因为Objective-C(下称ObjC)本质是一个C语言的超集,所以所有C语言支持的基本数据类型,ObjC同样支持,并且ObjC还支持一些其它的常用数据类型。
int 与 NSInteger
C语言中的int,在ObjC中同样支持,但不建议你用int,而推荐使用Cocoa框架中的NSInteger,
详见NSInteger定义
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSI
typedef unsigned long NSUI
typedef int NSI
typedef unsigned int NSUI
注意,这里主要是为了同时匹配64位和32位处理器,在上面官方框架的代码中我们看到,64位内核中NSInteger为long型,而在32位内核中为int型,使用NSInteger,就不用特意去考虑内核位宽问题。
bool 与 BOOL
C语言标准中没有布尔型变量,C++中的bool类型,为true和false,这在许多其他的类C语言中都是一样的,例如java、C#、php等,但在ObjC中,你可以使用bool类型,但更建议使用ObjC专用的BOOL类型,这个基本布尔型的值为YES和NO。
float 与 CGFloat
CGFloat 不是Foundation框架的基础变量,而是定义在UIKit框架中,CG代表CoreGraphic(核心绘图框架)。从定义来看,float和CGFloat的区别也是根据系统内核位宽不同,类型不同。
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
/* Definition of the `CGFloat' type and `CGFLOAT_DEFINED'. */
typedef CGFLOAT_TYPE CGF
可以看到,64位中CGFloat是double类型,32位中则是float类型。
char和string类型在ObjC中同样可用,但是基本也可以不用。NSString作为整个Cocoa框架的灵魂类,强大无比,基本能胜任现代编程语言对于字符串的所有基本处理和更复杂的处理。详细使用方法将在后面专门章节介绍。
NSString类,不需要alloc和init,Cocoa框架高度优化了NSString类,让他在实例化时操作起来就好像基本类型一样。例如
NSString* textA = @"123";
NSString* textB = textA;
textA = @"456";
NSLog(@"%@",textA); //输出 456
NSLog(@"%@",textB); //输出 123
注意到没有,按道理说将textB指针指向textA以后,textA值改变,textB应该也跟着变。但实际情况并没有,这是因为对于NSString类型来说,等号赋值,实际是深度拷贝。textA=@"456"这一步textA的指针已经改变,实际操作等同于 textA = [@"456" copy]。textB = textA,实际操作等同于 textB = [textA copy]。这里的copy函数,是NSObject的不可变拷贝方法。
另外NSString类,本身支持与许多基本类型的互转。
//CGPoint 点转字符串
NSString *NSStringFromCGPoint(CGPoint point);
//CGVector 向量转字符串
NSString *NSStringFromCGVector(CGVector vector);
//CGSize 大小转字符串
NSString *NSStringFromCGSize(CGSize size);
//矩形转字符串
NSString *NSStringFromCGRect(CGRect rect);
//矩阵变换转字符串
NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
//边界转字符串
NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
//位移转字符串
NSString *NSStringFromUIOffset(UIOffset offset);
//上面的逆向方法
CGPoint CGPointFromString(NSString *string);
CGVector CGVectorFromString(NSString *string);
CGSize CGSizeFromString(NSString *string);
CGRect CGRectFromString(NSString *string);
CGAffineTransform CGAffineTransformFromString(NSString *string);
UIEdgeInsets UIEdgeInsetsFromString(NSString *string);
UIOffset UIOffsetFromString(NSString *string);
注意所有上面的互转方法都是C函数,可以在任何地方调用。CG系列的基本类型,则是使用C语言的结构体声明的。
另外NSString也可以转数字
NSString* number = @"1111113";
NSInteger intValue = [number integerValue]; //转整形
floatValue = [number doubleValue]; //转浮点
NSValue是个可以和各种基本数据类型互转的类。包括CGPoint、CGRect、CGSize等等。例如
[NSValue valueWithCGSize:CGSizeMake(100, 100)];
[NSValue valueWithRange:NSMakeRange(0, 10)];
NSNumber与上面不同的是,NSNumber不是基本数据类型,而是对象。NSNumber 继承自 NSValue,而NSValue继承自NSObject。NSNumber支持和基本数据类型的互转。
另外NSNumber支持和NSString一样的@符号简写
NSNumber * number = @(123);
NSNumber * number1 = @(3.1415);
NSNumber * number2 = @(YES);
NSInteger intValue = [number integerValue];
CGFloat floatValue = [number1 doubleValue];
BOOL boolValue = [number2 boolValue];
在C和C++中常用的基本类型数组,在ObjC中对应的是NSArray类,这个类中存储的数据,也必须是类,而不能是基本数据类型,所以要将基本数据类型转换成对象存储,例如
//注意这里用@[]方式返回NSSArray对象
NSArray* numbers = @[@(1),@(2),@(3)];
这里numbers数组中存储了1,2,3三个NSNumber类型数据。
在ObjC中二维数组或多维数组并不常见,如有需要,建议使用C的数组进行存储。
本章中除了基本数据类型,还介绍了部分ObjC的基本容器,例如NSString,NSValue,NSArray等,这些基本容器是Cocoa框架不可或缺的血液,贯穿始终。我们将在后面的章节介绍更多的基本容器,和他们的基本使用方法。
原来还有打赏功能,那就给1快钱买瓶水吧。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
Cocoa 框架和 Cocoa Touch框架相关文章
· 14人关注
原来还有打赏功能,那就给1快钱买瓶水吧。
选择支付方式:

我要回帖

更多关于 date转化为string类型 的文章

 

随机推荐