我有一个类(A),它有一个struct变量(S).在这个类的一个函数中,我在struct变量上调用一个mutating函数,这个函数需要一个闭包.此闭包的主体检查struct变量的name属性.
结构的变异函数依次调用某个类(B)的函数.这个类的函数再次关闭.在这个闭包的主体中改变结构,即更改name属性,并调用第一个类提供的闭包.
当我们检查struct的name属性时调用第一个类(A)闭包时,它永远不会被更改.
但是在第2步中,如果我使用结构(C)而不是类B,我会看到内部类A的闭包结构实际上已经改变了.以下是代码:
class NetworkingClass {
func fetchDataOverNetwork(completion:()->()) {
// Fetch Data from netwrok and finally call the closure
completion()
}
}
struct NetworkingStruct {
func fetchDataOverNetwork(completion:()->()) {
// Fetch Data from netwrok and finally call the closure
completion()
}
}
struct ViewModelStruct {
/// Initial value
var data: String = "A"
/// Mutate itself in a closure called from a struct
mutating func changeFromStruct(completion:()->()) {
let networkingStruct = NetworkingStruct()
networkingStruct.fetchDataOverNetwork {
self.data = "B"
completion()
}
} …Run Code Online (Sandbox Code Playgroud) 我很清楚Swift中值类型和引用类型之间的区别,并且意识到值类型被设计为不可变的用法.但结构特别有能力改变自己,这是我的担忧.如何有效地使用这些变异的struct值类型,以便它们保持其状态或变化.
我的问题是,在iOS应用程序的MVVM设计中应该将模型视为类还是结构?由于视图模型包含模型/模型列表,并且这些模型实例可以随时间变化(例如,视图模型从Web服务请求获取更多模型实例并添加到其模型数组中),视图控制器的视图模型如何更新这种变化.这是一个伪示例,但首先是一些注意事项和简要说明:
例:
查看型号:
struct DummyViewModel {
private var ints:[Int] = []
var count: Int {
return ints.count
}
init() {}
mutating func fetchData(completionHandler:(NSError? ) -> Void) {
Networking.getDataFromRemote() { response in
self.ints.append(1)
completionHandler(nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
查看控制器:
class DummyViewController: UIViewController{
private var dummyViewModel: DummyViewModel?
override func viewDidLoad() {
super.viewDidLoad()
/// Setup the view model
dummyViewModel = DummyViewModel()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
loadData()
}
} …Run Code Online (Sandbox Code Playgroud) 环境:
Swift >=2.3,Swift 应用程序中的 Swift 框架
设置:
APIService.framework.public class APIService.swift并且具有静态功能。它有另一个public class Item.swift.
一个快速的应用程序,使用 APIService.framework
APIService.function()class Item.swift如果 App 需要引用框架的 Item 类,它必须这样做,APIService.Item但由于 APIService 是框架内的一个类,编译器总是尝试在 APIService 类中而不是在 APIService 模块中查找属性,因此会抛出一个错误说
'Item' is not a member type of 'APIService'
Run Code Online (Sandbox Code Playgroud)
可能的解决方案:
所有这些都只是变通方法,真正的问题仍然是编译器无法区分模块名称和类名称。Swift 中有什么我可以说的"Don't look into the ModuleName.swift, instead look into the whole Module"吗?
我想做什么:
我尝试过的:
创建一个快速动态框架SwiftDemo.framework
在"链接的框架和库"中添加了ObjCDemo.framework .如果没有自动添加,请将ObjCDemo.frameworks路径放在"框架搜索路径"中.使用"import ObjCDemo"访问ObjCDemo.framework .构建SwiftDemo.framework.它构建良好,没有错误,没有警告
创建一个SwiftDemo应用程序.
在"嵌入式二进制文件"部分中添加SwiftDemo.framework .
尝试构建SwiftDemo.app,下面是错误:
ld:未找到框架objCDemo用于体系结构x86_64
显然SwiftDemo.app无法找到SwiftDemo.framework使用的ObjCDemo.framework,接下来我做了:
尝试构建SwiftDemo.app,没有错误,但这是我为ObjCDemo.framework中的每个文件获得的控制台警告:
objc [15127]:类在/ Users/tarun/Library/Developer/CoreSimulator/Devices/4391A259-64DF-4893-BE09-31B5D2D5BC8C/data/Containers/Bundle/Application/CD896A7B-1868-44D1-BFEA-6CC081AD41DB中实现/SwiftDemo.app/Frameworks/SwiftDemo.framework/Swift和/ Users/tarun/Library/Developer/CoreSimulator/Devices/4391A259-64DF-4893-BE09-31B5D2D5BC8C/data/Containers/Bundle/Application/CD896A7B-1868-44D1- BFEA-6CC081AD41DB/SwiftDemo.app/SwiftDemo.将使用两者之一.哪一个未定义.
显然这些文件在SwiftDemo.framework和SwiftDemo.app中都是重复的,所以为了避免接下来我做了:
尝试构建SwiftDemo.app,没有错误,但这是编译时警告:
ld:警告:自动链接提供的'.../SwiftDemo/ObjCDemo.framework/ObjCDemo',..../SwiftDemo/ObjCDemo.framework/ObjCDemo中的框架链接器选项不是dylib
无论我怎么都无法通过这些错误或警告.有人解决了这个问题吗?
swift ×4
ios ×3
mvvm ×2
frameworks ×1
module ×1
mutable ×1
namespaces ×1
objective-c ×1
value-type ×1