在Swift中,定义常见模式的常规方法是什么?在这种模式下,属性是从外部读取的,但在拥有它的类(和子类)内部可以修改。 在Objective-C中,有以下选项: 在接口中声明该属性为只读属性,并使用类扩展来在内部访问该属性。 这是基于消息的访问,因此它与KVO,primefaces性等很好地配合 在界面中声明属性只读,但在内部访问后援伊娃。 因为ivar的默认访问是受保护的,所以这在类层次结构中很好地起作用,其中子类也将能够修改该值,但是该字段是以其它方式只读的。 在Java中,惯例是: 声明一个受保护的字段,并实现一个公共的,只读的getter(方法)。 Swift的成语是什么?
在C / Objective-C中,使用MIN和MAXmacros可以find两个数字之间的最小值和最大值。 Swift不支持macros,似乎在语言/基础库中没有等价物。 是否应该使用自定义解决scheme,也许基于这样的generics?
在Objective-C中,你可以区分primefaces和非primefaces属性: @property (nonatomic, strong) NSObject *nonatomicObject; @property (atomic, strong) NSObject *atomicObject; 从我的理解中,您可以安全地读取和写入从多个线程定义为primefaces的属性,同时从多个线程写入和访问非primefaces属性或ivars可能会导致未定义的行为,包括访问错误。 所以如果你在Swift中有这样一个variables: var object: NSObject 我可以安全地并行读写这个variables吗? (不考虑这样做的实际意义)。
如语言规范中所述,可以使用扩展为现有的Swift对象types添加扩展。 因此,可以创build扩展名,例如: extension String { var utf8data:NSData { return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! } } 但是,包含这样的扩展名的Swift源文件的最佳命名实践是什么? 在过去,惯例是使用Objective-C指南中讨论的Objective-Ctypes的extendedtype+categoryname.m 。 但是Swift的例子没有一个类别名称,并且调用String.swift似乎不合适。 所以问题是:给定上面的String扩展名,应该调用swift源文件是什么?
我试图将我的一些Obj-C类转换成Swift。 还有一些其他的Obj-C类仍然在那个转换的类中使用枚举。 我在预发布文档中search,无法find它,或者我错过了它。 有没有办法在Obj-C类中使用Swift枚举? 或者链接到这个问题的文档? 这就是我如何在旧的Obj-C代码和新的Swift代码中声明我的枚举。 我的老对象C代码: typedef NS_ENUM(NSInteger, SomeEnum) { SomeEnumA, SomeEnumB, SomeEnumC }; @interface SomeClass : NSObject … @end 我新的斯威夫特代码: enum SomeEnum: NSInteger { case A case B case C }; class SomeClass: NSObject { … } 更新:从答案。 它不能在Swift早于1.2的版本中完成。 但根据这个官方Swift博客 。 在与XCode 6.3一起发布的Swift 1.2中,您可以在Objective-C中使用Swift Enum, @objc在enum前面添加@objc
在Objective-C中: @interface CustomDataSource : NSObject <UITableViewDataSource> @end 在Swift中: class CustomDataSource : UITableViewDataSource { } 但是,将出现错误消息: types“CellDatasDataSource”不符合协议“NSObjectProtocol” types“CellDatasDataSource”不符合协议“UITableViewDataSource” 什么应该是正确的方法?
假设我有一个协议: public protocol Printable { typealias T func Print(val:T) } 这是实施 class Printer<T> : Printable { func Print(val: T) { println(val) } } 我的期望是,我必须能够使用Printablevariables来打印这样的值: let p:Printable = Printer<Int>() p.Print(67) 编译器抱怨这个错误: “协议”Printable“只能用作通用约束,因为它具有自我或相关types的要求” 我做错了什么? 无论如何解决这个问题? **EDIT :** Adding similar code that works in C# public interface IPrintable<T> { void Print(T val); } public class Printer<T> : IPrintable<T> […]
注意:在这里有针对客观的c发布的类似问题,但是我想快速实现它。 我有一个像这样快速声明的类: import UIKit class EachDayCell : UITableViewCell { @IBOutlet var dateDisplayLabel : UITextField @IBOutlet var nameDisplayLabel : UITextField @IBAction func goToPendingItems(sender : AnyObject) { } @IBAction func showDateSelectionPicker(sender : AnyObject) { } init(style: UITableViewCellStyle, reuseIdentifier: String!) { super.init(style: style, reuseIdentifier: reuseIdentifier) } } 现在我想要在swift中获得一个数组:dateDisplayLabel,nameDisplayLabel。 我怎样才能做到这一点?
我有个问题。 我有一个旧的Objective C项目,我想调用新的Swift函数和对象,我已经创build了文件“-Bridging-Header.h”和“-Swift.h” 很容易我从Swift调用目标C的function,但我有一个相反的问题。 所以我创build了一个简单的类“System.Swift” import Foundation @objc class System : NSObject { @objc func printSome() { println("Print line System"); } } 现在我已经尝试按照这里的文档,并在<…> – Swift.h文件中我写这个 @class System; @interface System : NSObject -(void)printSome; @end 我已经在我的目标C类中导入它。 在我的目标C代码(目前UIViewController)的目标C代码中,我尝试调用“printSome”方法: – (void)viewDidLoad { [super viewDidLoad]; System * sis = [[System alloc] init]; [sis printSome]; //any additional setup after loading the […]
我已经看到了这个代码在Swift网站和各种职位在这里,我正在努力掌握的基本知识。 这条线是如何评估的? if let name = optionalName { 我很困惑,因为它不是名称==可选的名称,它的分配值,那么如何报告是真实的,为什么当你用nilreplace约翰appleseed是不正确的,因为它仍然是平等的? var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" }