小编tar*_*rma的帖子

类和结构闭包中的Swift可变结构表现不同

我有一个类(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)

mutable mvvm ios swift swift-structs

11
推荐指数
1
解决办法
3673
查看次数

Swift 2.2 MVVM视图模型作为可变结构不在视图控制器中维护状态

我很清楚Swift中值类型和引用类型之间的区别,并且意识到值类型被设计为不可变的用法.但结构特别有能力改变自己,这是我的担忧.如何有效地使用这些变异的struct值类型,以便它们保持其状态或变化.

我的问题是,在iOS应用程序的MVVM设计中应该将模型视为类还是结构?由于视图模型包含模型/模型列表,并且这些模型实例可以随时间变化(例如,视图模型从Web服务请求获取更多模型实例并添加到其模型数组中),视图控制器的视图模型如何更新这种变化.这是一个伪示例,但首先是一些注意事项和简要说明:

  • 我这里没有使用任何绑定.(没有RxSwift).
  • 没有KVO,我正在使用委托或完成处理程序设计.

例:

  • 视图控制器具有视图模型的实例.当它出现时,它要求视图模型从Web服务获取数据.
  • View模型触发服务,并在完成处理程序关闭中获得响应
  • 在此闭包视图模型中,将一些模型实例添加到其模型数组中.
  • View模型调用视图控制器的完成处理程序以通知服务请求的成功或错误.
  • View Controller对视图模型进行一些验证,然后相应地执行UI操作.

查看型号:

 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)

value-type mvvm ios swift swift-structs

7
推荐指数
0
解决办法
492
查看次数

Swift - 当框架/模块具有相同名称的类时无法使用命名空间

环境:

Swift >=2.3,Swift 应用程序中的 Swift 框架

设置:

  • 一个带有模块名称的 Swift 动态框架,比如 APIService.framework.
  • 它有 apublic 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)

可能的解决方案:

  • 将框架的模块名称更改为类名称以外的名称。
  • 将类名更改为模块名称以外的其他名称。
  • 在 APIService 类中放置一个“Item”静态属性,指向
    框架中的 Item 类。

所有这些都只是变通方法,真正的问题仍然是编译器无法区分模块名称和类名称。Swift 中有什么我可以说的"Don't look into the ModuleName.swift, instead look into the whole Module"吗?

namespaces module swift

6
推荐指数
1
解决办法
1463
查看次数

如何在没有警告的情况下使用Swift App +(Swift Framework + Objective C静态框架)

我想做什么:

  • 创建一个快速动态框架 - 说SwiftDemo.framework
  • Swift.framework依赖于外部Objective-C静态框架(没有可用的源代码) - Say ObjCDemo.framework.这个框架有它的模块文件,放在ObjCDemo.framework/Modules/module.modulemap中
  • 把这个SwiftDemo.framework放在一个Swift应用程序中.理想情况下,我希望我的swift应用程序能够使用SwiftDemo.framework和ObjCDemo.framework,而不会出现任何错误或警告.

我尝试过的:

  • 创建一个快速动态框架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,接下来我做了:

  • "链接的框架和库"中添加了ObjCDemo.framework,并相应地设置了SwiftDemo.app目标的"框架搜索路径"

尝试构建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 目标的ObjCDemo.framework表单"Linked Frameworks and Libraries",但保持"Frameworks Search Paths"仍然指向ObjCDemo.framework路径.

尝试构建SwiftDemo.app,没有错误,但这是编译时警告:

ld:警告:自动链接提供的'.../SwiftDemo/ObjCDemo.framework/ObjCDemo',..../SwiftDemo/ObjCDemo.framework/ObjCDemo中的框架链接器选项不是dylib

无论我怎么都无法通过这些错误或警告.有人解决了这个问题吗?

frameworks objective-c ios swift

5
推荐指数
0
解决办法
252
查看次数