我希望能够将一个类存储为变量,因此我可以稍后调用类方法,如下所示:
class SomeGenericItem: NSObject
{
var cellClass: AnyClass
init(cellClass: AnyClass)
{
self.cellClass = cellClass
}
func doSomething(p1: String, p2: String, p3: String)
{
self.cellClass.doSomething(p1, p2: p2, p3: p3)
}
}
class SomeClass: NSObject
{
class func doSomething(p1: String, p2: String, p3: String)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想能够说出类似的话:
let someGenericItem = SomeGenericItem(cellClass: SomeClass.self)
someGenericItem.doSomething("One", p2: "Two", p3: "Three")
Run Code Online (Sandbox Code Playgroud)
我想弄清楚的是:
1)如何定义协议,以便我可以调用类func doSomething?
2)cellClass的声明需要什么?
3)电话会是什么样的?
我正在尝试将常用的Swift代码集中到框架中,部分代码使用Google Analytics.我将Google Analytics作为Cocoapod引入,但是我无法像在原始项目中那样从新框架访问它,因为它是Objective-C并且框架中没有桥接头支持[我使用的是Swift 1.2].
我通常在桥接头中使用的代码行使所有这些工作:
#import <Google/Analytics.h>
我把它放在我的项目中的哪个位置使这一切都像以前在桥接头中那样工作?
我在Apple关于混合Swift和Objective-C的文档中发现的是:
从同一框架目标中导入代码
如果您正在编写混合语言框架,则可能需要从Swift访问Objective-C代码并从Objective-C访问Swift代码.
将Objective-C导入Swift
要在与Swift代码相同的框架目标中导入一组Objective-C文件,您需要将这些文件导入到框架的Objective-C伞形标题中.
从同一框架将Objective-C代码导入Swift
在"构建设置"下的"打包"中,确保将该框架目标的"定义模块"设置设置为"是".在您的伞头文件中,导入要向Swift公开的每个Objective-C头.例如:OBJECTIVE-C
import <XYZ/XYZCustomCell.h>
import <XYZ/XYZCustomView.h>
import <XYZ/XYZCustomViewController.h>
我认为最相关的短语是:
您需要将这些文件导入到框架的Objective-C伞头中
但这个文件是什么以及如何创建它?
Apple的文档较早提到(在表中):
Objective-C代码
导入Swift
#import"Header.h"
好吧,我尝试创建一个文件"Header.h"并导入它,但这不起作用.我不知道他们想说什么.我在构建设置中找不到任何"伞".
所以我的问题是,如何在我的Swift项目中导入这个文件(#import <Google/Analytics.h>),以便它可以像普通项目的桥接标题一样看到Google Analytics cocoapod框架?
更新:
我开始相信,Objective-c桥接头可能是与项目同名的.h文件.我现在尝试在那里添加import语句,我得到的错误是:
!在框架模块'JBS'中包含非模块化头
我正在尝试在Swift中构建一个通用的UITableViewController子类,它可以容纳任意数量的不同类型的表视图单元,而不具备任何内部知识.
要做到这一点,我正在尝试为我的模型和我的表视图单元格使用协议.模型的协议将返回我应该去的哪个单元类,并且单元的协议将返回问题的答案,例如给定模型的单元格高度应该是什么.
但是我在使协议工作时遇到问题,因为使用第二个协议我想要转到单元的类而不是它的实例.
模型的协议如下:
protocol JBSTableItemDelegate
{
func tableCellDelegate() -> JBSTableViewCellInterface
}
Run Code Online (Sandbox Code Playgroud)
细胞的协议如下:
protocol JBSTableViewCellInterface: class
{
static func registerNibsWithTableView(tableView: UITableView)
static func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath?, tableItem: JBSTableItemDelegate) -> CGFloat
static func tableView(tableView: UITableView, dequeueReusableCellWithIndexPath indexPath: NSIndexPath, tableItem: JBSTableItemDelegate, delegate: AnyObject) -> JBSTableViewCell
}
Run Code Online (Sandbox Code Playgroud)
请注意使用关键字"static".这些方法是UITableViewCell子类中的类方法,添加静态似乎是我需要做的,以验证这些类符合,或者我理解.
当我使用第一个协议时代码看起来像这样,它编译:
let tableViewCellInterface = tableItem!.tableViewCellInterface()
Run Code Online (Sandbox Code Playgroud)
它正在调用此方法(作为一个示例):
func tableViewCellInterface() -> JBSTableViewCellInterface
{
return JBSLiteratureTableViewCell.self as! JBSTableViewCellInterface
}
Run Code Online (Sandbox Code Playgroud)
这将返回单元格的类,例如"JBSLiteratureTableViewCell.self"
当我使用第二个协议时,代码看起来像这样,并且它不编译:
returnFloat = tableViewCellInterface.tableView(tableView, heightForRowAtIndexPath: indexPath, tableItem: tableItem!)
Run Code Online (Sandbox Code Playgroud)
由于之前的static关键字,它无法编译,我得到的编译器错误是:
'JBSTableViewCellInterface'没有名为'tableView'的成员
如果我从协议函数中取出静态关键字,它会编译,但是UITableViewCell子类抱怨说:
'JBSLiteratureTableViewCell'不符合协议'JBSTableViewCellInterface'
这是因为他们现在正试图确保实例方法存在,而不是这些方法.
如何使swift类符合类级别的协议,因此它可以是我的委托而不是类的某个实例?我确信我可以通过创建作为单例的协议JBSTableViewCellInterface的辅助类来解决这个问题并让它们完成工作,但我宁愿在它们的类方法中将它构建到UITableViewCell子类中.
此方法appStoreReceiptURL是SKPaymentTransaction上已弃用的transactionReceipt方法的替代方法.每个人都说只是使用这个电话:
NSURL *theURL = [[NSBundle mainBundle] appStoreReceiptURL];
Run Code Online (Sandbox Code Playgroud)
如果有收据,这应该返回收据的URL.但对我来说没有一个,因为这个值是零,而且据我所知,它不应该是.我在iOS 7上运行并且已经完成了一些应用内购买(设备上的沙箱).现在我正在尝试添加另一个应用内购买,自动续订订阅,我需要深入了解收据以获得订阅到期日期.但我无法通过这个简单的步骤,因为价值总是为零.
有谁知道为什么?
这是在Swift中:
let someString:String = "blah"
在Objective-C中有效地等同于此:
NSString * const someString = @"blah";
我一直在假设在Objective-C中以这种方式使用const关键字已经使它有效地等同于在Swift中引入,但听到确认后会很高兴.在Objective-C中定义局部变量时,很少有人以这种方式使用const,但它似乎等同于let.考虑到let的好处,确保指针不会发生突变,我想知道我现有的Objective-C项目是否会因为一直使用这个约定而无益.我的问题不是关于Swift String和NSString之间的区别.
当它们因为最后一个强引用消失而被清除时,如果这发生在另一个线程上,你会遇到问题吗?如果是这样,使用 atomic 是否正确?既然我相信 Swift 没有原子,那么那里的线程安全弱属性需要什么?
我刚刚发现我在动态框架(swift)中有一些警告,这些警告从未出现在我的问题导航器中,因为我的主项目被选中用于构建.这是正常的吗?有没有办法告诉Xcode总是显示子框架的警告?我不想因为我正在建造一切而不小心再次错过这样的警告.
需要说明的是,这与问题过滤器不为空是无关.