有没有办法从空数组中获取Array元素的实例?(我需要dynamic属性,因为我使用了一些KVC方法NSObject)
import Foundation
class BaseClass: NSObject {
func myFunction() {
doWork()
}
}
class Car: BaseClass {
dynamic var id: Int = 0
}
class Bus: BaseClass {
dynamic var seats: Int = 0
}
var cars = Array<Car>()
Run Code Online (Sandbox Code Playgroud)
我需要的是从这个空数组中获取空Car对象实例的vay,例如:
var carFromArray = cars.instanceObject() // will return empty Car object
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用:
var object = Array<Car>.Element()
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用,因为我从函数参数获取数组,我不知道它是元素类.
我已经尝试编写我自己的类型,它会这样做,并且它可以工作,但是我不能将其标记为dynamic因为它无法在Objective C中表示.我试图编写Array的扩展名
extension Array {
func instanceObject<T: BaseClass>() -> T? {
return T()
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用它时,它有时会抛出错误 fatal error: …
有没有办法编译本机C或C++代码并将其暴露给Linux上的Swift?我可以看到像libdispatch这样的几个Apple库是用纯C编写的,只要导入它们就可以在Swift中访问它们.
要设置示例,假设我有两个文件Car.c并Car.h定义了名为的结构Car.有没有办法可以编译它们并通过编写import语句在Swift中使用它们?
import Car
Run Code Online (Sandbox Code Playgroud)
我试着写module.modulemap里面目录下的文件.c,.h并且Package.swift文件位于:
module Car {
header "Car.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
并运行swift build.这个产量误差:
<unknown>:0: error: unexpected 'commands' value (expected map)
<unknown>:0: error: unable to load build file
Run Code Online (Sandbox Code Playgroud)
我正在使用Swift 3.0-dev版本(2016年3月24日)
[更新1]
我已经联系了Max(mxcl) - Swift Package Manager的创建者之一,他告诉我要删除modulemap它.c并将.h文件直接放在Sources文件夹中.我编译完这个包后,但它不能用作模块.此外,我无法调用文件中的任何已定义函数.h.
About a year ago, if you wanted to use Swift 4.2 for iOS development, you would have to install Xcode 10, which meant that you used iOS 12 SDK. As part your apps deployment, Swift 4.2 runtime would automatically be bundled with your app binary. This would mean that user installing your app would essentially download a copy of that Swift runtime that will enable your app work.
However, ABI stability came with Swift 5, and you no longer needed …
假设我有通用类Bus:
class Bus<T> {
func doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)
我可以创建它的实例:
var myBus = Bus<String>()
Run Code Online (Sandbox Code Playgroud)
现在我有一个函数,它接受一个参数AnyObject并测试它的类型:
func checkType(object: AnyObject) {
if let foo = object as? String {
println("string")
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我看不到一种方法来检查是否object是类型Bus和运行函数,doSomething()如果它是类型Bus.任何帮助,将不胜感激.
编辑:协议似乎也没有解决这个问题.
import Foundation
@objc protocol BusProtocol {
func doSomething() -> Void
}
class Bus<T> : BusProtocol {
func doSomething() -> Void {
println("asdf")
}
}
func checkType(object: AnyObject) {
if let foo = object as? Bus<AnyObject> { …Run Code Online (Sandbox Code Playgroud) 假设我们有以下具有可变状态的类:
class Machine {
var state = 0
}
Run Code Online (Sandbox Code Playgroud)
现在,假设有一些控制状态的内部机制。但是,任何线程或队列都可能发生状态更改,因此state必须在线程安全的环境中执行对属性的读写。为了实现这一点,我们将使用简单的sync(:_)方法dispatch_queue_t来同步对state变量的访问。(这不是唯一的方法,但这是一个例子)
现在,我们可以创建一个保存状态值的私有变量和另一个使用dispatch_sync(_:)方法的自定义 setter 和 getter 公共变量。
class Machine {
private var internalState = 0
var state: Int {
get {
var value: Int?
dispatch_sync(dispatch_get_main_queue()) {
value = self.internalState
}
return value!
}
set(newState) {
dispatch_sync(dispatch_get_main_queue()) {
self.internalState = newState
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
state 现在可以从任何队列或线程进行安全的同步访问 - 它是线程安全的。
现在问题来了。
XCTest?由于类Machine可以有一个复杂的状态机,我们需要测试它在任何环境中的表现:
state任何队列或线程的访问state从任何队列或线程写入成功测试这种行为的最佳方法是什么? …
NSOperationQueueclass 有一个underlyingQueue属性,用于设置将在其NSOperation上执行实例的调度队列。
let dispatchQueue = dispatch_queue_create("custom.queue", DISPATCH_QUEUE_SERIAL)
let opQueue = NSOperationQueue()
opQueue.underlyingQueue = dispatchQueue
Run Code Online (Sandbox Code Playgroud)
但是,官方文档指出:
此属性的值不能是由
dispatch_get_main_queue
苹果似乎没有更多关于这个问题的解释。但是,使用主队列 asunderlyingQueue不会引发任何错误,也不会产生任何不需要的行为。这背后的原因是什么?