2014-10-10 124 views
2

我创建了一个小的struct来保存版本号。Swift:不能在数组中存储不安全的指针

现在我搜索了一个紧凑的方法来将数字直接解析到结构体的变量中。我试图实现这种方式:

struct Version { 
    var major: Int = 0 
    var minor: Int = 0 
    var revision: Int = 0 

    init(string: String) { 
     let components = string.componentsSeparatedByString(".") 
     if 1...3 ~= components.count { 
      var targets = [&major, &minor, &revision] 
      for index in 0...2 { 
       var scanner = NSScanner(string: components[index]) 
       if (!scanner.scanInteger(target[index])) { 
        major = 0 
        minor = 0 
        revision = 0 
        return      
       } 
      } 
     } 
    }  
} 

但我收到此错误信息:

Type '[inout Int]' of variable is not materializable 

我不明白这个错误。有没有办法用这种方式来实现它,使用一些指向成员变量的指针?

更新

最后我没有使用不安全的指针。这是我最后的实现:

init(string: String) { 
    let components = string.componentsSeparatedByString(".") 
    if 1...3 ~= components.count { 
     var values = [0, 0, 0] 
     for index in 0..<components.count { 
      var scanner = NSScanner(string: components[index]) 
      if (!scanner.scanInteger(&values[index])) { 
       return 
      } 
     } 
     major = values[0] 
     minor = values[1] 
     revision = values[2] 
    } 
} 

回答

0

in-out不是UnsafePointer也不是UnsafeMutablePointer,只有当函数接受Unsafe???Pointer<T>系列参数时,输入表达式才会作为相应的指针类型传递。见:the docs

试试这个:

var targets:[Int] = [0,0,0]; 
for index in 0...2 { 
    var scanner = NSScanner(string: components[index]) 
    if (!scanner.scanInteger(&targets[index])) { 
     major = 0 
     minor = 0 
     revision = 0 
     return 
    } 
} 
major = targets[0] 
minor = targets[1] 
revision = targets[2] 

OR

var targets:[UnsafeMutablePointer<Int>] = [] 
targets.append(&major) 
targets.append(&minor) 
targets.append(&revision) 
for index in 0...2 { 
    var scanner = NSScanner(string: components[index]) 
    if (!scanner.scanInteger(targets[index])) { 
     major = 0 
     minor = 0 
     revision = 0 
     return 
    } 
} 
+0

太棒了!非常感谢你!奇怪为什么'.append'起作用,但'= [&major,...]'中的用法不适用。 – Flovdis 2014-10-10 15:46:43

3

问题是如何获得一个指向变量的指针。它可能 使用withUnsafeMutablePointers()

init(string: String) { 
    let components = string.componentsSeparatedByString(".") 
    if 1...3 ~= components.count { 
     withUnsafeMutablePointers(&major, &minor, &revision) { 
      (p1, p2, p3) -> Void in 
      let targets = [p1, p2, p3] 
      for index in 0...2 { 
       var scanner = NSScanner(string: components[index]) 
       if (!scanner.scanInteger(targets[index])) { 
        self.major = 0 
        self.minor = 0 
        self.revision = 0 
        break 
       } 
      } 
     } 
    } 
} 

但代码将可能更好可读三个独立的情况下,一个指针数组代替 。

+0

看来功能'withUnsafeMutablePointers'不是语言的一部分吗? – Flovdis 2014-10-10 15:44:51

+0

@Flovdis:为什么?我用Xcode 6.1 GM测试了代码,它按预期工作。 – 2014-10-10 15:55:43

+0

你说得对,没有关于这个功能的文档。 – Flovdis 2014-10-10 16:14:23